Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Membaca Nilai daripada Berbilang Goroutine dengan Selamat dalam Go?

Bagaimanakah Saya Boleh Membaca Nilai daripada Berbilang Goroutine dengan Selamat dalam Go?

Patricia Arquette
Lepaskan: 2024-12-25 05:03:21
asal
919 orang telah melayarinya

How Can I Safely Read Values from Multiple Goroutines in Go?

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()
}
Salin selepas log masuk

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)
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan