問題:
在實作執行緒安全佇列時,從空隊列中出隊時發生段錯誤。此問題源自於條件變數 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,從而防止嘗試從空隊列中出隊。
其他建議:
以上是為什麼我的 C 11 線程安全隊列在從空隊列出隊時出現段錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!