簡體   English   中英

absl :: Mutex的條件關鍵部分如何處理讀取器喚醒

[英]How absl::Mutex's conditional critical sections handle reader wakeups

我想知道最好問一下這樣的問題,所以我在Meta( https://meta.stackexchange.com/questions/304981 )上提出了這個問題並在這里進行了指導,所以這里有。

我真的很好奇Google使用absl::Mutexhttps://github.com/abseil/abseil-cpp/blob/master/absl/synchronization/mutex.h )對條件關鍵部分的實現進行了哪種優化。 特別是我想知道當讀者的情況變為現實時他們如何處理讀者喚醒。 他們是否也在等候名單中喚醒所有其他讀者? 這條線似乎表明他們確實這樣做了。這不是每次都有O(n)遍歷的風險,並且還有寫入優先級互斥體的風險嗎?

我認為設置設計和實現優化之間的差異非常重要。 似乎absl ::通過提供支持這些設計的實現來優先考慮更好的設計,而不是提供更好的優化組件。 有時,更好的設計本質上比笨拙的設計表現更好,因此結果在兩個因素(協同作用)上得到優化。 Absiel.io更詳細地討論了這一點。

從他們的消息來源來看,絕對不會嘗試魔術來避免向未決的讀者廣播,因此是的,雷鳴般的群體仍然是一個問題。 一般而言,任何實施都無法以有意義的方式解決該問題; 這是一個設計問題。

通過將條件作為鎖的一部分嵌入,absl:允許程序員避免或設計該問題。 仍然有一群人,但鎖定實施能夠在這里輕松計划9點頭 如果你設計好覺醒的原因,例如掩碼中的位,你可以安全地使用共享/獨占鎖,而不必擔心會影響你的性能的虛假喚醒。

這是“設計優化”的本質:問題在源中更明確地描述,並且所得到的實現具有比其他方式更高的質量(性能,縮放......)。

Plan9 條件變量等同於unix內核的睡眠概念(不是時間一)和喚醒。 當您檢測到某個對象未處於您需要的狀態時,您會執行一些操作以啟動將其置於該狀態,然后等待直到達到該狀態。 例如,您可以在緩存中查找對象,並在發現它不存在時,創建一個無效的對象並請求它變為有效。 這允許所有緩存參與者之間的一種對稱:它們鎖定對象,評估或更新其狀態,然后同時解鎖對象並等待對其進行進一步的更改。

丑陋的問題是存在:沒有同時發生的事情,而且b:鎖定處理容易出錯(我是否持有任何其他鎖?這會導致死鎖嗎?)並且在程序中沒有很好地表達。 Plan9的睡眠和喚醒優雅地融合了這些,因此在檢查條件時,任何人都不可能影響對象。 事實上,參考文獻的重點是執行這份簡單合同有多難。 例如 ,最好避免多處理環境中的復雜合同。

關鍵優化(在絕對:)是沒有必要通過昂貴的上下文切換操作來確定對象處於錯誤狀態,然后再回到睡眠狀態。 如果選擇喚醒你的代碼可以驗證對象狀態是你可能感興趣的那個,那就更好了。 函數調用/方法調用比上下文切換快100倍。

Absl 本節介紹如何選擇喚醒候選者以及如何剔除牧群。 本節制作廣播。

因此前一部分從列表服務員中選擇元素,后一部分將其喚醒。 如果查看第2203行的其他條件,它會顯示編寫器將如何終止列表 - w_walk-> wake不成立,並且已設置wr_wait。 此外,2015年和2023年的早期測試會阻止構建此列表,如果它是寫入喚醒。

顯示器

obj.enter();
while (obj.state != StateIWant) {
    obj.wait();
}
...
obj.exit();

需要此線程執行保護條件。 移動該阻塞線程的動作可能是執行條件的成本的1000倍。 相反:

obj.wait(^{return obj.state == StateIWant;});
...
obj.exit();

允許等待調用在允許等待的任何線程(即調用退出)的上下文中評估條件,從而避免在無用情況下的昂貴的上下文切換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM