Здравствуйте.
Представляю вам библиотеку ASYNCLIB (своя собственная разработка). Ознакомится можно здесь
http://groups.google.com/group/asynclib?hl=enВ кратце: библиотека представляет из себя микс между TBB (где работа task'ифицируется через интеловские примитивы и выполняется на фиксированном количетсве рабочих потоков) и windows threads (где каждый поток имеет свой контектс, который OS в любой момент может сменить на контекст другого потока), что-то типа ?многопоточность с кооперативной многозадачностью?.
Другими словами, вы вашу работу разбиваете на задачи (чтение из файла/сокета, обработка чего-либо другого ? без ограничений здесь), чем меньше гранулярность, тем лучше (поскоку распаллелизовываться будет лучше). Тело задачи не имеет ограничений, кроме одного условия ? необходимо использовать примитивы синхронизации предоставленные библиотекой (можно также использовать стандартные примитивы). Далее, когда рабочий поток выполняя одну из ваших задач натыкается на блокирующее условие (например ? мутекс залочен другой задачей, или ввод/вывод еще не закончился) рабочий поток автоматически переключается на следующую задачу из вашего списка задач, обеспечивая тем самым максимальный throughput ваших задач на заданном количестве рабочих потоков.
Из плюсов данного подхода можно отметить следующие:
? автоматическое скалирование на многоядерных машинах
? уменьшение времени синхронизации задач (так как происходит смена более легковесного контекста задачи, в отличие от контекста потока) и уменьшение contention'а ваших данных (поскоку в любой момент выполняется количество задач не большее чем количество рабочих потоков)
? в целом классе задач отпадает необходимость писать стейтмашины (очень удобно для клиент-серверных приложений, в данном случае стейт сохраняется вместе с контекстом вашей задачи)
? более легковесные примитивы синхронизации чем нативные (самый маленький примитив занимает 2 бита)
Eсли есть вопросы, пишите (да и просто интересно знать ваше мнение).