亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

單通道 Goroutine 解鎖順序

單通道 Goroutine 解鎖順序

Go
楊__羊羊 2021-08-16 18:57:34
Goroutines 在通道上阻塞的順序是否決定了它們將解除阻塞的順序?我不關心發送的消息的順序(它們保證是有序的),而是將解除阻塞的 Goroutine 的順序。想象一個ch在多個 Goroutines(1、2 和 3)之間共享的空 Channel ,每個 Goroutine 都試圖在 上接收消息ch。由于ch為空,每個 Goroutine 都會阻塞。當我向 發送消息時ch,Goroutine 1 會先解除阻塞嗎?或者 2 或 3 人可能會收到第一條消息?(反之亦然,Goroutines 嘗試發送)我有一個操場似乎表明 Goroutines 阻塞的順序就是它們被解除阻塞的順序,但我不確定這是否是由于實現而導致的未定義行為。
查看完整描述

3 回答

?
三國紛爭

TA貢獻1804條經驗 獲得超7個贊

這是一個很好的問題 - 它涉及進行并發設計時的一些重要問題。如前所述,根據當前的實現,您的具體問題的答案是基于 FIFO。它不太可能有所不同,除非實施者出于某種原因認為 LIFO 更好。

沒有保證,雖然。因此,您應該避免創建依賴于特定實現的代碼。

更廣泛的問題涉及非確定性、公平饑餓。

也許令人驚訝的是,基于 CSP 的系統中的非確定性并非來自并行發生的事情。有可能是因為并發,但不是因為并發。相反,當做出選擇時會出現不確定性。在 CSP 的正式代數中,這是用數學建模的。幸運的是,您無需了解數學即可使用 Go。但形式上,兩個 goroutine 代碼并行執行,如果消除所有選擇,結果仍然是確定性的。

Go 允許select通過 goroutine 之間共享的通道的末端顯式和隱式引入非確定性的選擇。如果你有點對點(一個讀者,一個作者)的渠道,就不會出現第二種。因此,如果它在特定情況下很重要,則您可以做出設計選擇。

公平饑餓通常是同一枚硬幣的兩面。饑餓是那些可能導致性能不佳,更可能導致錯誤行為的動態問題之一(以及死鎖、活鎖和競爭條件)。這些動態問題是不可測試的(更多關于這個),需要一些層次分析來解決。顯然,如果系統的一部分因為無法訪問某些資源而沒有響應,那么在管理這些資源時就需要更加公平。

由于當前的 FIFO 行為,對通道端的共享訪問可以很好地提供一定程度的公平性,這似乎就足夠了。但是,如果您希望它得到保證(無論實現的不確定性如何),則可以select在數組中使用 a和一組點對點通道。通過始終按照將最后選擇的放在堆底部的順序優先選擇它們,很容易實現公平索引。此解決方案可以保證公平性,但可能會帶來很小的性能損失。

(旁白:請參閱“Wot No Chickens”,了解英國坎特伯雷的研究人員關于 Java 虛擬機中的公平性缺陷的一個有點有趣的發現——該缺陷從未得到糾正!)


查看完整回答
反對 回復 2021-08-16
?
大話西游666

TA貢獻1817條經驗 獲得超14個贊

順序未指定,但當前的實現使用 FIFO 隊列來等待 goroutine。

權威文檔是Go Memory Model。內存模型沒有為發送到同一個通道的兩個 goroutine 定義發生在之前的關系,因此沒有指定順序。同上接收。


查看完整回答
反對 回復 2021-08-16
  • 3 回答
  • 0 關注
  • 233 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號