Многопоточная обработка потока данных
От: Aniskin  
Дата: 05.05.18 13:29
Оценка:
Прошу совета, как улучшить алгоритм синхронизации.

Задача – обработать входной поток неким алгоритмом и сохранить результат в выходном потоке. Есть пул потоков, каждый поток выполняет одинаковую задачу, состоящую из следующих пунктов:
0) Захват ReadMutex
1) Получение ID блока (просто число начиная от 1, увеличивается с каждым блоком) и чтение блока данных.
2) Освобождение ReadMutex
3) Обработка блока данных
4) Захват WriteMutex
5) Если ID последнего записанного блока равно текущему ID-1, то запись блока в выходной поток, освобождение WriteMutex, goto 0, иначе 6
6) освобождение WriteMutex, Sleep(100), goto 4.

Как видно из схемы работы, если поток B обработал блок данных N раньше, чем поток A обработал блок данных N-1, то возникает цикл с использованием Sleep. Но мне ну очень не нравиться этот цикл (жру понапрасну такты процессора, тем самым увеличивая энтропию вселенной и приближаю ее тепловую смерть). Хочется заменить на какой-нибудь WaitForSingleObject, но не могу придумать, что же конкретно мне ждать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.