Возможно ли иметь boost::thread
спать бесконечно после того, как его работа завершена, а затем разбудить его от другого boost::thread
?
С помощью while(1)
Они идеально подходят для выделенного сервера, где я хочу, чтобы потоки запускали все ядра на 100%, но я пишу сервер websocket ++, который будет работать на рабочем столе, поэтому я хочу только boost::thread
запускать, когда у них действительно есть работа, поэтому я могу выполнять другую работу на своем рабочем столе без снижения производительности.
Я видел другие примеры, где boost::thread
s установлены в sleep()
на постоянное количество времени, но я бы не стал тратить время на поиски этой оптимальной константы; кроме того, мне нужно, чтобы сервер websocket ++ отвечал как можно быстрее, когда он получает данные для обработки.
Если это возможно, как это может быть сделано с несколькими потоками, пытающимися пробудиться?
Этот механизм реализуется так называемой условной переменной, см. повышение :: condition_variable. По сути, ожидающий поток будет спать на заблокированном мьютексе, пока другой поток не сообщит о состоянии, тем самым разблокировав его.
Остерегайтесь ложных пробуждений. Иногда ожидающая нить просыпается без уведомления. Это означает, что вы все равно должны поместить цикл while, который проверяет предикат (или условие) для расшифровки между реальными пробуждениями и ложными.
да, pthread_mutex_t + pthread_cond_t — это то, что нужно использовать, вы можете найти соответствующий
вещь в повышении.