ホームページ  >  記事  >  バックエンド開発  >  sync.Cond と単純なロックを使用する場合: sync.Cond の問題と代替解決策

sync.Cond と単純なロックを使用する場合: sync.Cond の問題と代替解決策

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-12 00:16:031026ブラウズ

When to Use sync.Cond vs. Simple Locking: A Problem with sync.Cond and an Alternative Solution

sync.Cond の不正な使用法のトラブルシューティング

最初の問題の概要:

sync.Cond を使用しようとすると、競合状態。デッドロックにより即座にパニックが発生します。開発者は、ミューテックスのロックと条件の Wait メソッドの呼び出しの間に問題があると疑っています。

対象ユースケースの明確化:

競合状態とは別に、主な目標は複数のゴルーチンが長時間実行されるダウンロードから HTTP ヘッダーが利用可能になるのを待つ同期メカニズムを作成することです。 goroutine.

解決策:

  • sync.Cond の必要性を再評価する: この場合、単純な sync.Mutex で十分です。ライター (ダウンローダー) が 1 つだけで、リーダー (アクセスするゴルーチン) が複数あるためです。ヘッダー).
  • 複数のリーダーと 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。