Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
2 / 2 / 1
Регистрация: 19.01.2013
Сообщений: 155

Доступ к стриму из разных потоков

24.01.2013, 10:14. Показов 2270. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача такая, имеем мемористрим, в одном потоке постоянно пишем его. В другом потоке необходимо по запросу считывать весь поток в байтаррай, но чтобы позиция при записи не сместилась. Как решение вижу применение монитора, но хотелось бы услышать другие предложения.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.01.2013, 10:14
Ответы с готовыми решениями:

Обезопасить доступ к коллекции из разных потоков
станет ли безопасным метод AddSafe? public static MyCollection myCol = new MyCollection(); class MyCollection:...

Параллельная запись текста в файл из разных потоков
Есть несколько потоков, каждый из них должен записывать информацию в файл. При этом не после закрытия StreawWriter'a, а сразу же. Есть...

Параллельный доступ потоков к переменной string
Есть кусок кода который должен выполняться параллельно. Это парсер который получает контактные данные пользователя и должен записывать...

16
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
24.01.2013, 13:42
Зачем такие жертвы, останавливай запись потока, считывай, потом разблокируй, сделай всё на булевых флагах.
В зависимости от приоритета переключай запись и чтение, скажем если приоритет считывания выше, значит он устанавливает false на запись и считывает, потом разрешает запись. А объекты ядра оставьте для худших вариантов.
0
2 / 2 / 1
Регистрация: 19.01.2013
Сообщений: 155
24.01.2013, 13:44  [ТС]
в разных потоках говорю. как я просто так возьму и остановлю этот процесс в другом потоке.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
24.01.2013, 14:12
Цитата Сообщение от danrusm Посмотреть сообщение
Зачем такие жертвы, останавливай запись потока, считывай, потом разблокируй, сделай всё на булевых флагах.
В зависимости от приоритета переключай запись и чтение, скажем если приоритет считывания выше, значит он устанавливает false на запись и считывает, потом разрешает запись. А объекты ядра оставьте для худших вариантов.
Какой странный плохой совет. А если поток который читает, проверит флаг и сразу после этого второй поток скинет его. Получится, что stream будет доступен обоим потокам.

Используйте синхронизацию (lock). Если думаете, что будет медленно - замерьте производительность.
0
2 / 2 / 1
Регистрация: 19.01.2013
Сообщений: 155
24.01.2013, 14:14  [ТС]
Дык я и предложил лок использовать, он же монитор. Но меня производительность смутила немного. Ладно сделаю как и хотел.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
24.01.2013, 14:32
Цитата Сообщение от Villain512 Посмотреть сообщение
Но меня производительность смутила немного.
Поэтому я и говорю - чтобы не смущала, замерьте производительность. До и после.
0
2 / 2 / 1
Регистрация: 19.01.2013
Сообщений: 155
24.01.2013, 21:18  [ТС]
задача несколько изменилась. Скорость записи то не страдает, а вот скорость чтения и занимаемая память страдает.

Нужно чтобы данные писались не в стрим а добавлялись в массив байт без копирования его самого. чтобы я мог в любой момент считать оттуда данные безовсяких преобразований. Сейчас используется аррай.копи, но меня терзают сильные сомнения по его поводу (не проверял работу с большими объемами данных).

Как можно добавлять данные в массив фиксированной длинны (именно byte[], всякие там листы не предлагать, никакие преобразования не разрешены, ибо я в теории могу по 10000раз считать его во время добавления туда данных), чтобы небыло лишнего потребления памяти или ненужных вычислений?
0
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
25.01.2013, 15:14
Я предложил как вариант.
Если потоков всего два, пишущий и читающий, вообще не вижу проблем в моём варианте, флагами управляет читающий поток. Ну моё дело предложить, по мне объект ядра так вообще не нужен. Хотя товарищь Villain512 так смело оперирует словами процесс и поток, что меня это смущает.
А данные без разрыва добавлять нельзя, только в случае заранее зарезервированного объёма памяти.
0
2 / 2 / 1
Регистрация: 19.01.2013
Сообщений: 155
25.01.2013, 15:20  [ТС]
под процессом имеется ввиду не процесс самого приложения, а просто слово процесс как оно есть

Если один поток читает а второй пишет то у них будет конфликт, если не синхронизовать их работу локом.

Мемори стрим по причине потребления памяти мне не подходит. допустим я скачиваю файл размером 2 гига, чтобы им воспользоваться придется считать его из стрима и поместить в массив байт. а это еще 2 гига и затраты процессора. Необходимо использовать общий массив байт и как то без затрат добавлять в него. См. выше.
0
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
25.01.2013, 20:41
Если я понял правильно, вы хотите использовать общую память для загрузки в неё информации и параллельного чтения.
В таком случае вообще не вижу причин для синхронизации, синхронизация нужна для двух пишущих потоков, а чтение можно осуществлять из множества потоков без какой либо синхронизации. Тут просто надо публичный счётчик, в котором будет отображаться длинна записанных данных, чтоб в обработку читающего потока не попала хрень.
Если предоставите больше информации о работе приложения, можно будет более предметно обсуждать.

Добавлено через 6 минут
Если у вас происходит фрагментная запись по мере закачки, можно очень даже хорошо пристроить List<byte[]> , скажем каждые 10 мегабайт скачаного будут скидываться в лист, а читающий поток будет получать доступ и будет знать где и что взять, но опять же синхронизация не нужна. При желании даже на винт можно скидывать частями по мере обработки.
0
2 / 2 / 1
Регистрация: 19.01.2013
Сообщений: 155
25.01.2013, 20:46  [ТС]
синхронизация согласно первоначальной задумке была нужна для того чтобы чтение и запись не были одновременно, чтобы после чтения я мог вернуть указатель на место.

List<byte[]>
И как интересно это решит проболему, если память все равно будет потребляться вдвойне, когда я захочу получить из этого листа целый массив байт.

Если предоставите больше информации о работе приложения, можно будет более предметно обсуждать.
Это не приложение а класс отдельный, для работы в любом приложении.

Тут просто надо публичный счётчик, в котором будет отображаться длинна записанных данных, чтоб в обработку читающего потока не попала хрень.
Хрень какаято)


Единственный разумный выход который пришел мне в голову это писать данные через прямой доступ к памяти в исходный массив байт (если конечно нельзя его изменить размер динамически без потребления дополнительной памяти), но это как то дико и опять же стоит вопрос о производительности.
0
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
26.01.2013, 07:44
Уважаемый Villain512, только вы знаете как собираетесь обрабатывать данные, я вас просто убеждаю что нет необходимости синхронизации читающего и пишущего потока, нужно только договориться о размере. Если вы не хотите фрагментировать данные, резервируйте пространство заранее, ведь речь шла о скачивании файла, не надо буквально всё понимать, адаптируйте под свои нужды на здоровье.
Кстати по поводу получения целого массива, собирайте его постепенно, я вам предложил лист, лишь для того чтоб не замораживать резервируемое пространство для всего файла. В общем я вижу вы сами понимаете что вам делать.
0
2 / 2 / 1
Регистрация: 19.01.2013
Сообщений: 155
26.01.2013, 10:18  [ТС]
Ну про создание массива заранее это понятно если размер известен. но на выходе то я должен получить массив текущего размера, а не общий . Вдобавок есть такая штука как чанкед транспорт энкодинг. Там нету макс размера, а есть только размер текущего блока.

Чтобы пересобрать массив из чего угодно так или иначе придется потреблять память в двойном размере. Поэтому ненадо ничего пересобирать.
0
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
26.01.2013, 11:30
Мне кажется, цель для вашего класса излишне абстрактная, определите её для себя чётко, хотя вам опять же виднее.
0
2 / 2 / 1
Регистрация: 19.01.2013
Сообщений: 155
26.01.2013, 11:51  [ТС]
Да нету ничего абстрактного. задача вполне ясна. нужно писать данные в массив байт и должна быть возможность их считывания в любой момент оттуда, безо всяких доп потреблейний памяти и преобразований.

Это необходимая мне функция в библиотеке, позволяющая прервать соединение при получении необходимой инфы. допустим я качаю файл 1гб а мне требуется оттуда определенный кусок вначале. не стану же я ждать пока весь скачается .
0
49 / 49 / 2
Регистрация: 17.07.2011
Сообщений: 318
26.01.2013, 14:19
Да какие проблемы, качайте в неразрывный массив, расположенный в заранее зарезервированном пространстве необходимого размера, и счётчик скачаного сделайте, как я уже говорил, чтоб не считывать то, чего ещё нет. А синхронизацией тут и не пахнет.
0
2 / 2 / 1
Регистрация: 19.01.2013
Сообщений: 155
26.01.2013, 14:21  [ТС]
Мне нужен на выходе массив который имеет размер соответствующий размеру скаченного. Вдобавок опять напомню про чанкед транспорт энкодинг.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.01.2013, 14:21
Помогаю со студенческими работами здесь

Одновременный доступ к коллекции из двух потоков
Здравствуйте. В программе открываю UDP-сокет, в который приходят данные с устройства. Вкратце, у меня выглядит это так: public void...

Реализовать многопоточный доступ к N-ой переменной из N-го кол-во потоков
Добрый день дорогие пользователи. В общем проблема состоит в том,что мне нужно реализовать многопоточный доступ к N-ой переменной из N-го...

Доступ к элементам управления (DGW, ListBox) из потоков
Под элементами управления имею в виду datgaridview, listbox и т.д. В общем подскажите в какую сторону &quot;копать&quot;?

Совместный доступ к переменно главного потока из порожденных потоков
Всем привет! Задача такая: Из некой базы каждый из потоков читает свою порцию данных, а на выходе имеет коллекцию строк. И все эти...

Доступ к БД с разных потоков
как реализовать доступ к одной базе данных с разных потоков? когда один сервер обрабатывает несколько клиентов то у меня выходит...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru