給出以下示例: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 回答

米琪卡哇伊
TA貢獻1998條經驗 獲得超6個贊
通道旨在在線程之間共享(這是“線程安全”的通常含義)。使用頻道意味著您沒有共享的內存,而您可能會冒著種族危險。因此,丹尼爾(Daniel)的答案是正確的:使用渠道,因為這就是他們的目的。
但是請注意,goroutine創建了通信順序過程的網絡,如果存在設計錯誤,有時可能會死鎖。他們還可以進行活鎖(同樣的事情,但是很忙)。
有很多有關如何避免死鎖/活鎖的知識。這很大程度上是從Occam在80年代和90年代流行的時代開始的。諸如Jeremy Martin(無死鎖并發系統的設計策略),Peter Welch(高級范例)等人提供了一些特殊的寶石。
- 2 回答
- 0 關注
- 227 瀏覽
添加回答
舉報
0/150
提交
取消