簡體   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