Adakah Membaca Nilai daripada Benang Berbeza Selamat?
Dalam Go, akses serentak yang selamat kepada nilai memerlukan penyegerakan apabila berbilang goroutin terlibat, terutamanya apabila sekurang-kurangnya seorang daripada mereka melakukan penulisan. Dalam senario yang diberikan, adalah perlu untuk melaksanakan penyegerakan untuk melindungi daripada tingkah laku yang tidak ditentukan.
Pendekatan Disyorkan: Menggunakan Mutex
Saluran, walaupun pilihan untuk menghantar mesej, mungkin memperkenalkan kerumitan yang tidak perlu disebabkan oleh penyegerakan yang diperlukan untuk mendapatkan semula mesej dalam urutan utama. Sebaliknya, adalah disyorkan untuk menggunakan mutex baca-tulis (sync.RWMutex). Kunci ini melindungi data dengan menguatkuasakan pemerolehan kunci untuk mengubah suai operasi (pekerja) dan akses baca sahaja untuk mendapatkan semula status (urutan utama).
Contoh Pelaksanaan
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() }
Pendekatan ini memastikan bahawa pekerja yang mengubah suai kiraan lelaran memperoleh kunci tulis, manakala utas utama yang membaca kiraan memperoleh bacaan kunci.
Alternatif: Operasi Atom
Pakej penyegerakan/atom menyediakan operasi atom yang membolehkan pengubahsuaian bebas penyegerakan bagi jenis data tertentu, seperti integer. Ia memastikan integriti dengan mengehadkan membaca dan mengubah suai operasi kepada fungsi atomnya.
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) } func (w *Worker) incIter() { atomic.AddInt64(&w.iter, 1) }
Pendekatan ini menawarkan mekanisme penyegerakan yang lebih mudah, tetapi ambil perhatian bahawa ia hanya terpakai untuk jenis data tertentu.
Dengan menerima pakai salah satu kaedah ini, anda boleh membaca nilai daripada pekerja dengan selamat dalam urutan yang berbeza, menjamin integriti data dan mengelakkan tidak ditentukan tingkah laku.
Atas ialah kandungan terperinci Bagaimana untuk Membaca Nilai dengan Selamat daripada Goroutine Berbeza dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!