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

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

從多個go例程中收集數據的線程安全方法

從多個go例程中收集數據的線程安全方法

Go
狐的傳說 2021-05-14 22:23:54
給出以下示例:http : //play.golang.org/p/owvJ8Oi77Sfunc produce(dataChannel chan int) {    for i := 0; i < 10; i++ {        dataChannel <- i    }}func main() {    dataChannel := make(chan int)    go produce(dataChannel)    go produce(dataChannel)    go produce(dataChannel)    for i := 0; i < 30; i++ {        data := <-dataChannel        fmt.Printf("%v ", data)    }}我是否認為從多個go例程寫入通道不安全是正確的嗎?是否有安全的常用/慣用方式?我知道您可以為每個生成數據的例程創建一個單獨的通道,我只是想知道這是否是最干凈的解決方案,或者是否還有其他選擇。
查看完整描述

2 回答

?
犯罪嫌疑人X

TA貢獻2080條經驗 獲得超4個贊

通道是完全線程安全的。它們是goroutine之間進行交流的官方方式。我認為您的代碼沒有錯。這就是Go的美。


查看完整回答
反對 回復 2021-05-24
?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

通道旨在在線程之間共享(這是“線程安全”的通常含義)。使用頻道意味著您沒有共享的內存,而您可能會冒著種族危險。因此,丹尼爾(Daniel)的答案是正確的:使用渠道,因為這就是他們的目的。

但是請注意,goroutine創建了通信順序過程的網絡,如果存在設計錯誤,有時可能會死鎖。他們還可以進行活鎖(同樣的事情,但是很忙)。

有很多有關如何避免死鎖/活鎖的知識。這很大程度上是從Occam在80年代和90年代流行的時代開始的。諸如Jeremy Martin(無死鎖并發系統的設計策略),Peter Welch(高級范例)等人提供了一些特殊的寶石。


查看完整回答
反對 回復 2021-05-24
  • 2 回答
  • 0 關注
  • 227 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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