Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bila hendak menggunakan sync.Cond vs. Simple Locking: Masalah dengan sync.Cond dan Penyelesaian Alternatif

Bila hendak menggunakan sync.Cond vs. Simple Locking: Masalah dengan sync.Cond dan Penyelesaian Alternatif

Linda Hamilton
Linda Hamiltonasal
2024-11-12 00:16:03986semak imbas

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

Menyelesaikan Masalah Penyegerakan yang salah.Penggunaan Cond

Garis Masalah Awal:

Percubaan untuk menggunakan penyegerakan.Cond menghasilkan keadaan perlumbaan, menyebabkan panik serta-merta kerana kebuntuan. Pembangun mengesyaki isu antara mengunci Mutex dan menggunakan kaedah Tunggu syarat.

Penjelasan Kes Penggunaan Yang Dimaksudkan:

Selain daripada keadaan perlumbaan, matlamat utama adalah untuk mencipta mekanisme penyegerakan di mana berbilang goroutine menunggu pengepala HTTP tersedia daripada muat turun yang lama goroutine.

Penyelesaian:

  • Nilai Semula Keperluan untuk penyegerakan.Cond: Dalam kes ini, penyegerakan mudah.Mutex sudah memadai kerana hanya terdapat seorang penulis (pemuat turun) dan berbilang pembaca (goroutine mengakses pengepala).
  • Contoh dengan Berbilang Pembaca dan Satu Penulis:

    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()
    }

Penyelesaian Alternatif:

Jika menggunakan saluran boleh dilaksanakan dalam situasi ini, ia masih merupakan kaedah pilihan untuk menghantar data sekeliling.

Atas ialah kandungan terperinci Bila hendak menggunakan sync.Cond vs. Simple Locking: Masalah dengan sync.Cond dan Penyelesaian Alternatif. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn