Dalam senario di mana berbilang rangkaian beroperasi serentak dalam Go, memastikan akses data yang selamat adalah penting. Artikel ini meneroka senario di mana utas utama memerlukan pengumpulan data daripada utas pekerja tanpa menjejaskan keselamatan utas.
Senario
Urut utama mencipta berbilang utas pekerja, setiap satu berjalan masuk goroutine sendiri dan menambah kiraan lelaran pada selang masa yang tetap. Setiap 10 saat, utas utama bertujuan untuk mengumpul kiraan lelaran daripada pekerja dan memaparkan statistik yang disatukan.
Soalan
Memandangkan utas utama hanya membaca semasa urutan individu menulis, adakah selamat untuk mengakses nilai secara langsung? Bagaimanakah ini boleh dilaksanakan dengan berkesan?
Jawapan
Membaca nilai secara langsung daripada urutan berbeza tanpa penyegerakan sememangnya tidak selamat dalam Go, kerana ia mungkin menunjukkan tingkah laku yang tidak ditentukan. Untuk memastikan integriti data, beberapa bentuk penyegerakan diperlukan.
Pertimbangan Pelaksanaan
Penyelesaian yang dicadangkan menggunakan penyegerakan.RWMutex untuk melindungi data yang dikongsi. Apabila pekerja menulis pada kiraan lelaran, mereka memperoleh kunci tulis dan apabila utas utama dibaca, ia memperoleh kunci baca.
Kod Contoh Menggunakan penyegerakan.RWMutex
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) incIter() { w.iterMu.Lock() w.iter++ w.iterMu.Unlock() }
Sebagai alternatif, pakej penyegerakan/atom boleh digunakan untuk mengurus pengubahsuaian data selamat benang, seperti yang ditunjukkan dalam perkara berikut kod:
Contoh Kod Menggunakan penyegerakan/atom
type Worker struct { iter int64 } func (w *Worker) Iter() int64 { return atomic.LoadInt64(&w.iter) } func (w *Worker) incIter() { atomic.AddInt64(&w.iter, 1) }
Atas ialah kandungan terperinci Bagaimana untuk Membaca Nilai dengan Selamat daripada Berbilang Goroutine dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!