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

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

Barbara Streisand
Barbara Streisandasal
2024-12-25 09:53:35420semak imbas

How to Safely Read Values from Different Goroutines in Go?

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!

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