首頁 > 後端開發 > C++ > 為什麼我的 C 11 線程安全隊列在從空隊列出隊時出現段錯誤?

為什麼我的 C 11 線程安全隊列在從空隊列出隊時出現段錯誤?

Linda Hamilton
發布: 2024-10-30 20:34:02
原創
939 人瀏覽過

Why Does My C  11 Thread-Safe Queue Segfault When Dequeuing from an Empty Queue?

具有條件變數的C 11 執行緒安全佇列實作

問題:

在實作執行緒安全佇列時,從空隊列中出隊時發生段錯誤。此問題源自於條件變數 wait_for 函數,該函數預計僅在收到通知時才傳回。然而,wait_for函數傳回cv_status::no_timeout後,佇列有時仍為空。

解:

正確的做法是反轉條件監控的條件多變的。在這種情況下,q.empty() 應反轉為 !q.empty(),因為所需的條件是佇列至少有一個元素。以下是修改後的出隊方法:

<code class="cpp">std::string FileQueue::dequeue(const std::chrono::milliseconds& timeout)
{
    std::unique_lock<std::mutex> lock(qMutex);
    while (q.empty()) {
        if (populatedNotifier.wait_for(lock, timeout) == std::cv_status::timeout) {
            return std::string();
        }
    }
    std::string ret = q.front();
    q.pop();
    return ret;
}</code>
登入後複製

現在,如果佇列在超時時間後仍為空,wait_for 函數將只傳回 cv_status::timeout,從而防止嘗試從空隊列中出隊。

其他建議:

  • 使用可重複使用執行緒安全佇列的範本。
  • 在類別的建構子中初始化佇列,而不是內聯
  • 避免使用std::lock_guard 而使用std::unique_lock,因為這可以確保即使在臨界區內拋出異常,互斥體也能解鎖。

以上是為什麼我的 C 11 線程安全隊列在從空隊列出隊時出現段錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板