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

use*_*967 2 c++ multithreading condition-variable poco-libraries visual-studio-2015

由于某种原因,调用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();
Run Code Online (Sandbox Code Playgroud)

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

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

use*_*967 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(); 
Run Code Online (Sandbox Code Playgroud)

  • 发布您的调查结果对您有好处.可能很好编辑问题标题和标签,以帮助其他Poco用户(和更少的非Poco用户)找到问题.... (4认同)