Решено: http://rsdn.ru/forum/dotnet/5966027.1Автор: Albeoris
Дата: 26.02.15
Дамы и господа, подскажите, встречали ли вы готовы компонент следующего вида:
Нужна "флейта" вокруг массива. С одной стороны он наполняется (поточно), из произвольных мест считывается (поточно), при этом требуется синхронизация между потоками чтения и записи, чтобы чтение не происходило до того момента, пока данные не будут записаны, но отваливалось как только отваливается запись, не достигнув отметки чтения.
Первый вариант я сделал на коленке. Но пошёл по неверному пути, в результате получилась труба с асинхронным чтением/записью, не поддерживающая организации конвейеров, умирающая на таймаутах чтения при большом количестве параллельных операций (свыше 100) и подпёртая костылями на все случаи жизни. Когда работает — работает быстро, но это не то.
Сейчас у меня сложилось представление о том, как должен выглядеть подобный класс. Ближайший аналог — MemoryMappedFile с ожиданием читающих потоков до момента записи в память (Сам MMF не подходит, так как его невозможно создать без физического представления файла на файловой системе, а без этого весь выигрыш производительности упадёт).
В итоге я хочу получить механизм, который позволит асинхронно запустить расшифровку входного потока, тут же начать асинхронную распаковку дешифрованных данных и асинхронно же натравить на распаковываемые данные десяток потоков, которые будут считывать их их разных мест или ожидать, пока те не будет заполнены асинхронно работающим потоком записи.
Приветствуются упоминания готовых классов с подобным функционалом, аргументированные доводы против изобретения велосипеда и советы по реализации (впрочем, мне пока решение представляется довольно простым и изящным и не вызывает вопросов, если не найдётся готового — организую самостоятельно).
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт