在主程序退出期间销毁等待std :: conditional_variable的线程的正确方法

时间:2017-01-13 05:30:33

标签: c++ multithreading condition-variable

我正在使用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>]

1 个答案:

答案 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();

它在很大程度上是个人偏好......两个代码部分都完成了同样的任务。