私の場合、何千ものゴルーチンが同時に動作していwork()
ます。sync()
ゴルーチンもありました。開始時sync
に、同期ジョブが完了した後、しばらく一時停止するために他のゴルーチンが必要です。これが私のコードです:
var channels []chan int
var channels_mutex sync.Mutex
func work() {
channel := make(chan int, 1)
channels_mutex.Lock()
channels = append(channels, channel)
channels_mutex.Unlock()
for {
for {
sync_stat := <- channel // blocked here
if sync_stat == 0 { // if sync complete
break
}
}
// Do some jobs
if (some condition) {
return
}
}
}
func sync() {
channels_mutex.Lock()
// do some sync
for int i := 0; i != len(channels); i++ {
channels[i] <- 0
}
channels_mutex.Unlock()
}
ここでの問題は、<-
が読み取り時に常にブロックしているため、 に行くたびにブロックしてsync_stat := <- channel
いることです。チャネルが閉じられていてもブロックされないことはわかっていますがwork()
、終了するまでこのチャネルを使用する必要があるため、閉じられたチャネルを再開する方法が見つかりませんでした。
私は間違った方法で自分自身を疑っていますので、どんな助けも大歓迎です。他のゴルーチンを一時停止して再開する「エレガントな」方法はありますか?