Поточная "флейта" (эволюция трубы) вокруг массива
От: Albeoris  
Дата: 24.02.15 21:02
Оценка: :)
Решено: http://rsdn.ru/forum/dotnet/5966027.1
Автор: Albeoris
Дата: 26.02.15


Дамы и господа, подскажите, встречали ли вы готовы компонент следующего вида:

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

Первый вариант я сделал на коленке. Но пошёл по неверному пути, в результате получилась труба с асинхронным чтением/записью, не поддерживающая организации конвейеров, умирающая на таймаутах чтения при большом количестве параллельных операций (свыше 100) и подпёртая костылями на все случаи жизни. Когда работает — работает быстро, но это не то.

Сейчас у меня сложилось представление о том, как должен выглядеть подобный класс. Ближайший аналог — MemoryMappedFile с ожиданием читающих потоков до момента записи в память (Сам MMF не подходит, так как его невозможно создать без физического представления файла на файловой системе, а без этого весь выигрыш производительности упадёт).

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

Приветствуются упоминания готовых классов с подобным функционалом, аргументированные доводы против изобретения велосипеда и советы по реализации (впрочем, мне пока решение представляется довольно простым и изящным и не вызывает вопросов, если не найдётся готового — организую самостоятельно).
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
Отредактировано 26.02.2015 9:36 Albeoris . Предыдущая версия .
streaming pipe потоки
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.