Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mutexes lwn. Saluran dalam Go: Bila Untuk Menggunakan Setiap?

Mutexes lwn. Saluran dalam Go: Bila Untuk Menggunakan Setiap?

Linda Hamilton
Linda Hamiltonasal
2024-11-09 05:53:02588semak imbas

Mutexes vs. Channels in Go: When to Use Each?

Memilih Antara Mutex dan Saluran: Bila Perlu Menggunakan Setiap

Pengenalan

Apabila menyegerakkan akses serentak kepada sumber kongsi dalam Go , dua pilihan utama tersedia: sync.Mutex dan saluran (chan). Walaupun kedua-duanya boleh mencapai penyegerakan, kesesuaian mereka bergantung pada senario tertentu.

Mutex lwn. Saluran

Mutex (sync.Mutex):

  • Mengunci sumber, membenarkan hanya satu goroutine mengaksesnya pada satu-satu masa.
  • Menyediakan pemilikan eksklusif dan menjamin bahawa sumber yang dikunci kekal dalam keadaan konsisten.

Saluran (chan):

  • Memudahkan komunikasi antara gorouti dengan menghantar mesej atau data.
  • Menyokong akses serentak daripada berbilang goroutine, membenarkan pertukaran data dan penyegerakan.

Bila Menggunakan Mutex

  • Menjaga keadaan dalaman: Mutex sesuai untuk melindungi pembolehubah kongsi dalam satu goroutine, seperti struktur dalaman atau cache.
  • Masalah cache: Mutex boleh menyegerakkan akses kepada data cache, memastikan konsistensi data dan menghalang keadaan perlumbaan.
  • Untuk prestasi yang lebih baik: Mutex boleh menjadi lebih cekap daripada saluran dalam senario tertentu di mana pemilikan eksklusif sumber adalah penting.

Contoh:

  • Pembilang mudah menggunakan mutex untuk operasi kenaikan dan pengurangan yang disegerakkan.
var count int
var m sync.Mutex

func increment() {
    m.Lock()
    defer m.Unlock()
    count++
}
  • Permainan "ping-pong" menggunakan mutex untuk menghantar bola kongsi antara dua goroutin.
var ball *Ball
var m sync.Mutex

func player(name string) {
    for {
        m.Lock()
        ball.hits++
        fmt.Println(name, ball.hits)
        time.Sleep(100 * time.Millisecond)
        m.Unlock()
    }
}
  • Cache ringkas menggunakan mutex untuk menyegerakkan akses kepada peta.
var cache map[string]interface{}
var m sync.Mutex

func get(key string) interface{} {
    m.Lock()
    defer m.Unlock()
    return cache[key]
}

Atas ialah kandungan terperinci Mutexes lwn. Saluran dalam Go: Bila Untuk Menggunakan Setiap?. 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