C 11 線程安全隊列:理解和調試
您在線程安全隊列實現中遇到分段錯誤dequeue() 函數,特別是當隊列為空時。出現此異常的原因是您的等待條件 wait_for(lock, timeout) 的結構不正確,無法處理虛假喚醒。
了解虛假喚醒
條件變數像 populatedNotifier 一樣,可能會遇到虛假喚醒,即在沒有發生任何實際通知的情況下喚醒它們。此行為是底層多執行緒實作中固有的,並且可能是不可預測的。
更正條件
為了避免依賴可能不可靠的通知,最佳實踐要求使用相反的方法所需的條件作為dequeue() 和類似函數中while循環的基礎:while (!condition)。在此循環中:
範例實作
這裡是修訂版dequeue() 函數的版本:
std::unique_lock<:mutex> lock(qMutex);
while (q.empty()) {
c.wait(lock);
if (q.empty()) { // Immediately check the condition again after acquiring the lock
return std::string();
}
}
std::string ret = q.front();
q.pop();
return ret;
透過遵循這些準則,您可以確保等待條件穩健且不易受到虛假喚醒的影響,從而有效解決分段錯誤問題。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3