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