sleep boost :: thread до бесконечности и разбудить из другого потока?

Возможно ли иметь boost::thread спать бесконечно после того, как его работа завершена, а затем разбудить его от другого boost::thread?

С помощью while(1)Они идеально подходят для выделенного сервера, где я хочу, чтобы потоки запускали все ядра на 100%, но я пишу сервер websocket ++, который будет работать на рабочем столе, поэтому я хочу только boost::threadзапускать, когда у них действительно есть работа, поэтому я могу выполнять другую работу на своем рабочем столе без снижения производительности.

Я видел другие примеры, где boost::threads установлены в sleep() на постоянное количество времени, но я бы не стал тратить время на поиски этой оптимальной константы; кроме того, мне нужно, чтобы сервер websocket ++ отвечал как можно быстрее, когда он получает данные для обработки.

Если это возможно, как это может быть сделано с несколькими потоками, пытающимися пробудиться?

0

Решение

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

Остерегайтесь ложных пробуждений. Иногда ожидающая нить просыпается без уведомления. Это означает, что вы все равно должны поместить цикл while, который проверяет предикат (или условие) для расшифровки между реальными пробуждениями и ложными.

3

Другие решения

да, pthread_mutex_t + pthread_cond_t — это то, что нужно использовать, вы можете найти соответствующий
вещь в повышении.

1

По вопросам рекламы [email protected]