Информация об изменениях

Сообщение Поточная "флейта" (эволюция трубы) вокруг массива от 24.02.2015 21:02

Изменено 26.02.2015 9:36 Albeoris

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

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

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

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

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

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


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

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

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

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

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

Приветствуются упоминания готовых классов с подобным функционалом, аргументированные доводы против изобретения велосипеда и советы по реализации (впрочем, мне пока решение представляется довольно простым и изящным и не вызывает вопросов, если не найдётся готового — организую самостоятельно).
streaming pipe потоки