И еще.
Если программа не завязана на ввод-вывод, а нужно просто что-то делать параллельно безотносительно системных событий, то можно использовать таймеры.
Т.е. взводим несколько таймеров (по числу задач) с нулевым ожиданием а в обработчике таймера — сначала читаем контекст (значения переменных), выполняем некоторую небольшую порцию полезных действий, потом сохраняем свой контекст. Далее, если задача не завершена, снова взводим таймер задачи, после чего отдаем управление.
Срабатывает следующий таймер и т.д.
Получаем кооперативную многозадачность.
Привет, windows 3.1
Здравствуйте, sts, Вы писали:
sts>Здравствуйте, Lavik, Вы писали:
L>>Здравствуйте, okman, Вы писали:
А>>>>...
O>>>В Windows есть I/O Completion Ports, например (здесь).
O>>>Предназначено специально для таких задач.
L>>Спасибо за ответ, okman.
L>>Возможно, то что вы предлагаете — это хорошое решение, но что делать если вы не используете Windows? хотелось бы узнать как решаются подобные задачи в общем случае, без привязки к конкретным OC.
L>>К слову, I/O Completeon Ports, неявно использует пул трэдов, а хотелось бы, чтобы обработка всех запросов выполнялась в одном трэде.
sts>Паттерн называется реактор.
sts>Эффективные решения обычно зависят от платформы.
sts>В линуксе это epoll, в BSD — kqueue, в Windows, как уже сказали, completeon ports.
sts>На C стоит использовать какую-нибудь обертку.
sts>Наиболее легковесными и вроде как популярными являются libevents и более новая libev.
sts>Для с++ это наверное boost.Asio
sts>Если эффективность не столь важна, то можно использовать select или poll.
sts>Указанные либы впрочем и это умеют.