为什么std :: condition_variable :: notify_one阻塞?

时间:2016-05-09 04:32:35

标签: c++ multithreading visual-studio-2015 poco-libraries condition-variable

由于某种原因,调用signal.notify_one()会阻止当前线程并且不会返回。我从未听说过这种行为,我也不知道如何解决这个问题。

{
  std::lock_guard<std::mutex> lock(_mutex);
  _exit = true; // _exit is a std::atomic<bool> 
}

std::cout << "before" << std::endl;
_signal.notify_one();
std::cout << "after" << std::endl;

_thread.join();

我正在使用Microsoft Visual C ++ 2015,并且在销毁期间调用上面的代码。

我希望你能指出我正确的方向,非常感谢你的帮助!

2 个答案:

答案 0 :(得分:6)

哦,我终于找到了问题。为了给出一些背景知识,我目前正在使用一些Poco库(参见http://pocoproject.org/),我实现了自己的Poco :: Channel。经过一番挖掘,我意识到Poco将所有频道保留在静态 LoggingRegistry中,只有在所有剩余线程都被杀死后才会释放。

我最好的猜测是,如果线程被终止,等待 std :: condition_variable std :: condition_variable 将变为无效。

无论如何,为了防止这个问题,必须在main(int argc, char** argv)返回之前调用以下内容:

Poco::Logger::shutdown();
Poco::LoggingRegistry::defaultRegistry().clear(); 

答案 1 :(得分:0)

我在嵌入式环境中遇到了类似的行为。根据您的操作系统中condition_variables的实现方式,通知线程可能会隐式等待通知的线程。

如果您的通知线程的优先级非常低并且被阻止运行一段时间,则对notify_one()的调用也可能会阻塞,直到系统有时间安排低优先级任务为止。