為什麼 muduo的非同步日誌這裡。非常規的condition variable 這裡不會造成競爭狀態?

時間 2021-06-03 06:31:17

1樓:邱昊宇

「unusual usage」指的是使用方法非常規,而不是條件變數本身非常規。

條件變數的常規用法是用while 包裹,檢查實際的條件是否滿足,從而排除假喚醒(spurious wakeup)的可能。

例子中的waitForSeconds 的作用是在「乙個 buffer 寫滿」「距離上次序列化超過一定時間」等情況發生時將日誌序列化到磁碟。即便因為假喚醒等原因返回,頂多是兩次儲存日誌的時間不足預定間隔。如果業務上可以接受這種情況,那麼就沒有問題,額外檢查條件是否滿足、還剩多久才超時在這樣的場景下就有點把問題複雜化了。

當然,題目裡擔心的情況也是不會發生的,條件變數本身等待時解鎖 mutex,返回時加鎖 mutex,所以不會造成兩處同時在臨界區內執行的情況。

不過這確實是個好問題,因為問題的根源可能是你忘了條件變數會操作互斥器。比較一下:

// muduo 的 Condition

cond_

.waitForSeconds

(flushInterval_

);// std::condition_variable

cond_

.wait_for

(mutex_

,flushInterval_

);後者顯式表明了 wait_for 的操作會涉及 mutex_,一定程度上避免了題目中的誤解。套用 Pythonista 常說的一句話:Explicit is better than implicit。

非同步社群為什麼叫「非同步」,名字由來?

虛妄 我們先來看看解釋,非同步傳送方發出資料後,不等接收方發回響應,接著傳送下個資料報的通訊方式。同步就是發出方發出資料後,需要等待接收方發回響應。從上文中我們就不難看出非同步社群取此名的含義了,畢竟沒有乙個企業是希望自己的企業是止步不前的,個人認為非同步社群取此名的含義為永不止步,永遠前進的含義。...

非同步大多比同步快嗎?為什麼?

馬雲是非同步執行,他能驅動很多人替他做事,這些很多人做的事,看起來就像馬雲乙個人做的一樣。本質上是驅動其他 同步程序 去做了。同步是普通人,自己上班掙錢存錢買房,你不能跳過步驟,你不上班就掙不到錢,沒有掙錢就不能買房,同步是一步一步的。誰快? 駿馬金龍 同步,是程序自己做本應該阻塞的兩端資料同步任務...

為什麼 Google 裡面沒有個人日誌功能?

Google 沒有明確的用途,你幾乎可以用它做任何事情。有的時候,沒有明確的用途更好,這樣你就可以不用拘泥於一種用途之中,你可以用各種方式來完成你所需要做的事情。日誌這一功能,你可以間接通過 Blogger 來實現。 多二度 首先,G 的資訊流雖說沒有字數限制,但不能看做是個人日誌,要寫個人日誌谷歌...