繁体   English   中英

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

[英]why is std::condition_variable::notify_one blocking?

由于某种原因,调用 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,上面的代码在销毁期间被调用。

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

好吧,我终于找到了问题所在。 为了提供一些背景知识,我目前正在使用一些 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(); 

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM