我有一个服务器正在侦听某个端口,我创建了几个分离的线程。
不仅自己的服务器将永远运行,而且分离的线程也将永远运行。
//pseudocode
void t1_func()
{
for(;;)
{
if(notified from server)
dosomething();
}
}
thread t1(t1_func);
thread t2(...);
for(;;)
{
// read from accepted socket
string msg = socket.read_some(...);
//notify thread 1 and thread 2;
}
由于我不熟悉多线程,我不知道如何在服务器中实现这样的nofity
,在分离的线程中实现check the nofity
。
任何有用的提示将不胜感激。
答案 0 :(得分:0)
最简单的方法是使用std::condition_variable
。
std::condition_variable
会等到另一个线程调用它上面的notify_one
或notify_all
,然后才会唤醒它。
以下是使用条件变量实现的t1_func
:
std::condition_variable t1_cond;
void t1_func()
{
//wait requires a std::unique_lock
std::mutex mtx;
std::unique_lock<std::mutex> lock{ mtx };
while(true)
{
t1_cond.wait(lock);
doSomething();
}
}
wait
方法需要std::unique_lock
,但不必共享锁来通知线程。当你想从主线程中唤醒工作线程时,你可以像这样调用notify_one
或notify_all
:
t1_cond.notify_one();
如果您希望在一段时间后唤醒线程,可以使用wait_for
代替wait
。