Membuka Mutex Sebelum Mengubah Suai Nilai
Dalam coretan kod berikut, mutex digunakan untuk melindungi sumber. Walau bagaimanapun, mutex dibuka kuncinya sebelum mengubah suai nilai.
type Stat struct {
counters map[string]*int64
countersLock sync.RWMutex
averages map[string]*int64
averagesLock sync.RWMutex
}
func (s *Stat) Count(name string) {
s.countersLock.RLock()
counter := s.counters[name]
s.countersLock.RUnlock()
if counter != nil {
atomic.AddInt64(counter, int64(1))
return
}
}
Salin selepas log masuk
Penjelasan:
-
Soalan 1 (Mengapa menggunakan mutex ?):
- Apabila mengakses data kongsi antara berjalan serentak goroutine, adalah penting untuk mengelakkan perlumbaan data.
- Perlumbaan data berlaku apabila berbilang gorouti mengakses sumber yang sama pada masa yang sama, yang berpotensi membawa kepada tingkah laku yang salah atau tidak dapat diramalkan.
- Mutexes (kedua-duanya Mutex biasa dan RWMutex) berfungsi sebagai mekanisme penguncian yang membolehkan gorout bergilir-gilir mengakses dan mengubah suai data yang dikongsi, menghalang data perlumbaan.
-
Soalan 2 (Apakah yang dikunci RWMutex?):
- Kaedah RLock pada penyegerakan.RWMutex mengunci keseluruhan struct penerima (s jenis Stat dalam contoh).
- Ia membenarkan berbilang goroutine untuk membaca data secara serentak tetapi menghalang sebarang goroutine daripada menulis kepadanya.
-
Soalan 3 (Adakah RWMutex mengunci medan purata?):
- RLock pada countersLock berfungsi tidak mengunci medan purata atau mutex yang berkaitan (averagesLock).
- Ini membenarkan gorout lain membaca dan mengubah suai medan purata secara serentak tanpa menjejaskan medan pembilang.
-
Soalan 4 (Mengapa menggunakan RWMutex vs saluran untuk concurrency?):
- Saluran ialah pilihan yang lebih cekap untuk komunikasi dan pemindahan data antara goroutine dan tidak bertujuan untuk melindungi data kongsi.
- Mutexes (cth., RWMutex) menyediakan kawalan terperinci ke atas akses kepada item data tertentu dalam perkongsian ingatan.
-
Soalan 5 (Mengapa menggunakan atomic.AddInt64?):
- atomic.AddInt64 menyediakan konkurensi- cara selamat untuk menambah nilai int64 dalam kaunter penunjuk.
- Ia memastikan operasi penambahan dilakukan secara atom, menghalang perlumbaan data dan menjamin bahawa kaunter dikemas kini secara konsisten merentas goroutine.
-
Soalan 6 (Mengapa membuka kunci sebelum menambah pada pembilang?):
- The countersLock.RUnlock() digunakan untuk melepaskan kunci baca pada medan pembilang.
- Dengan berbuat demikian, ia membenarkan goroutine lain mengakses medan pembilang semasa goroutine semasa melakukan penambahan atom.
- Ini memastikan bahawa akses kepada medan kaunter disegerakkan sambil mengekalkan keselarasan dan mengelakkan potensi data perlumbaan.
Atas ialah kandungan terperinci Mengapa Membuka Kunci Mutex Sebelum Mengubah Suai Nilai dalam Go Concurrency?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!