Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Membaca Nilai dengan Selamat daripada Berbilang Goroutine dalam Go?

Bagaimana untuk Membaca Nilai dengan Selamat daripada Berbilang Goroutine dalam Go?

Linda Hamilton
Linda Hamiltonasal
2024-12-21 15:47:14702semak imbas

How to Safely Read Values from Multiple Goroutines in Go?

Membaca Nilai daripada Berbilang Benang Dengan Selamat

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!

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