![](/img/trans.png)
[英]Why in std::condition_variable notify_all works faster than notify_one (on random requests)?
[英]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.