最初の問題の概要:
sync.Cond を使用しようとすると、競合状態。デッドロックにより即座にパニックが発生します。開発者は、ミューテックスのロックと条件の Wait メソッドの呼び出しの間に問題があると疑っています。
対象ユースケースの明確化:
競合状態とは別に、主な目標は複数のゴルーチンが長時間実行されるダウンロードから HTTP ヘッダーが利用可能になるのを待つ同期メカニズムを作成することです。 goroutine.
解決策:
複数のリーダーと 1 つのライターの例:
var sharedRsc = make(map[string]interface{}) func main() { var wg sync.WaitGroup wg.Add(2) m := sync.Mutex{} c := sync.NewCond(&m) go func() { c.L.Lock() for len(sharedRsc) == 0 { c.Wait() } fmt.Println(sharedRsc["rsc1"]) c.L.Unlock() wg.Done() }() go func() { c.L.Lock() for len(sharedRsc) == 0 { c.Wait() } fmt.Println(sharedRsc["rsc2"]) c.L.Unlock() wg.Done() }() c.L.Lock() sharedRsc["rsc1"] = "foo" sharedRsc["rsc2"] = "bar" c.Broadcast() c.L.Unlock() wg.Wait() }
代替ソリューション:
この状況でチャネルの使用が可能な場合は、依然としてチャネルの使用が推奨されます。データを渡すためのメソッド。
以上がsync.Cond と単純なロックを使用する場合: sync.Cond の問題と代替解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。