由于某种原因,调用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,并且在销毁期间调用上面的代码。
我希望你能指出我正确的方向,非常感谢你的帮助!
答案 0 :(得分:6)
我最好的猜测是,如果线程被终止,等待 std :: condition_variable , std :: condition_variable 将变为无效。
无论如何,为了防止这个问题,必须在main(int argc, char** argv)
返回之前调用以下内容:
Poco::Logger::shutdown();
Poco::LoggingRegistry::defaultRegistry().clear();
答案 1 :(得分:0)
我在嵌入式环境中遇到了类似的行为。根据您的操作系统中condition_variables的实现方式,通知线程可能会隐式等待通知的线程。
如果您的通知线程的优先级非常低并且被阻止运行一段时间,则对notify_one()的调用也可能会阻塞,直到系统有时间安排低优先级任务为止。