Membaca Nilai dengan Selamat daripada Benang Berbeza dalam Go
In Go, akses serentak kepada nilai daripada berbilang goroutine tanpa penyegerakan yang betul adalah berbahaya. Untuk memastikan integriti data, adalah penting untuk menggunakan mekanisme penyegerakan.
Penyegerakan dengan Mutex dan Kunci Baca/Tulis
Dalam senario yang diberikan, di mana urutan utama perlu dikumpulkan nilai daripada rangkaian pekerja setiap 10 saat, saluran tidak akan mencukupi. Sebaliknya, mutex baca/tulis boleh digunakan.
Pekerja akan memperoleh kunci tulis apabila mengemas kini nilai mereka, manakala urutan utama akan memperoleh kunci baca apabila mendapatkan semula nilai. Ini menghalang keadaan perlumbaan dan menjamin ketekalan data.
Contoh Pelaksanaan dengan Mutex
Kod berikut menunjukkan pelaksanaan mudah menggunakan mutex:
type Worker struct { iterMu sync.RWMutex iter int } func (w *Worker) Iter() int { w.iterMu.RLock() defer w.iterMu.RUnlock() return w.iter } func (w *Worker) setIter(n int) { w.iterMu.Lock() w.iter = n w.iterMu.Unlock() }
Alternatif: Menggunakan Atom Pembilang
Sebagai alternatif, pakej penyegerakan/atom menyediakan pembilang atom selamat benang, membenarkan operasi baca dan tulis terus tanpa overhed mutex.
type Worker struct { iter int64 } func (w *Worker) Iter() int64 { return atomic.LoadInt64(&w.iter) } func (w *Worker) setIter(n int64) { atomic.StoreInt64(&w.iter, n) }
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membaca Nilai daripada Berbilang Goroutine dengan Selamat dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!