第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

在選擇中支持一種通信(chan)

在選擇中支持一種通信(chan)

Go
慕桂英3389331 2022-06-21 15:49:32
我知道,如果有多個“通信”可以在select聲明中進行,則隨機選擇一個。我正在嘗試找到一種替代方法,它可以更喜歡一種“交流”而不是另一種。背景是我正在使用上下文殺死的通道上的 go-routine 中發(fā)送值。當我殺死它時,我希望立即關閉通道,但目前代碼有時會在關閉之前在通道上發(fā)送最終值。這是代碼的簡化版本:   ctx, cancel := context.WithCancel(context.Background())   ch := make(chan int)   go func() {      defer close(ch)      for i := 1; ; i++ {         select {         case <-ctx.Done():            return         case ch <- i:         }      }   }()   print(<-ch)   print(<-ch)   cancel()   print(<-ch)   print(<-ch)這有時會打印 1200,但通常會打印 1230。 在操場上嘗試一下關于如何重組代碼以支持第一種情況有什么想法嗎?(即讓它總是打印 1200。)
查看完整描述

2 回答

?
波斯汪

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

這似乎是不可能的,因為cancel()它不是主 goroutine 中的阻塞操作。正因為如此,當select解除阻塞時,可能會有多種情況可用,并且沒有辦法讓一個渠道優(yōu)于另一個渠道。任何類型的 check-channel-then-write 方案都將是活潑的,因為在檢查后可以取消上下文。

使用done通道并寫入它而不是上下文取消將起作用,因為寫入done通道將是主 goroutine 的阻塞操作,并且 select 將始終有一個活動案例。


查看完整回答
反對 回復 2022-06-21
?
幕布斯6054654

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

請注意,這是一個更新的答案,因為原始答案存在問題。


正如其他人所指出的,如果沒有額外的同步,您將無法避免競爭條件。您可以使用 Mutex,但sync.Cond看起來很合適。在下面的代碼中,接收 goroutine 表示它已從 chan 接收到值。它在發(fā)出信號之前取消上下文(使用Cond.Signal),發(fā)送 goroutine 等待信號。這避免了競爭條件,因為上下文狀態(tài)在被檢查之前已更新。


ctx, cancel := context.WithCancel(context.Background())

ch := make(chan int)

cond := sync.NewCond(&sync.Mutex{}) // *** new


go func() {

    defer close(ch)

    cond.L.Lock()                   // *** new

    defer cond.L.Unlock()           // *** new

    for i := 1; ; i++ {

        ch <- i                     // *** moved

        cond.Wait()                 // *** new

        if ctx.Err() != nil {       // *** changed

            return

        }

    }

}()


print(<-ch)

cond.Signal()                      // *** new

print(<-ch)

cond.Signal()                      // *** new

print(<-ch)

cancel()

cond.Signal()                      // *** new

print(<-ch)

cond.Signal()                      // *** new

這是我能看到的最簡單的方法,接收 goroutine 在取消上下文后將不會在通道上接收任何值。


查看完整回答
反對 回復 2022-06-21
  • 2 回答
  • 0 關注
  • 126 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號