我正在使用std :: conditional_variable来定时多线程程序中的信号,以控制各个关键部分的流量。该程序可以工作,但在退出时我被迫使用谓词(kill_ == true)来避免破坏仍在等待std :: conditional_variable :: wait()的线程。我不知道它是否是摧毁所有等待线程的正确方法,征求建议。这是一个代码段:
hdfs balancer
[-threshold <threshold>]
[-policy <policy>]
[-exclude [-f <hosts-file> | <comma-separated list of hosts>]]
[-include [-f <hosts-file> | <comma-separated list of hosts>]]
[-idleiterations <idleiterations>]
答案 0 :(得分:3)
这通常是我如何处理等待线程的破坏。你想要一个像这样的代码部分,你要执行清理(在类析构函数中,在进程退出之前的主线程等):
{
std::lock_guard<std::mutex> lock(mu_flow);
kill_ = true;
}
cv_command_exec_.notify_all();
thread1.join();
我假设timer::section()
正在某个帖子std::thread thread1
内执行。
互斥锁的所有权持续时间由范围块控制。只有当您设置kill_ = true
并在调用.notify_all()
之前释放时,您才会想要保留互斥锁(否则唤醒线程可能会发现锁定仍然保持并重新进入睡眠状态。)
当然,std :: unique_lock的用法如下:
std::unique_lock<std::mutex> lock(mu_flow);
kill_ = true;
lock.unlock();
cv_command_exec_.notify_all();
thread1.join();
它在很大程度上是个人偏好......两个代码部分都完成了同样的任务。