Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah Append Function Thread-Selamat untuk Penggunaan Goroutine Serentak?

Adakah Append Function Thread-Selamat untuk Penggunaan Goroutine Serentak?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-18 21:53:02857semak imbas

Is Append Function Thread-Safe for Concurrent Goroutine Usage?

Adakah Lampiran Tidak Selamat Benang untuk Penggunaan Serentak oleh Berbilang Goroutine?

Apabila menggunakan goroutin untuk menambahkan data secara serentak pada kepingan dalam gelung , anda mungkin menghadapi ketidakkonsistenan, seperti unsur yang tiada atau pendua. Senario ini menimbulkan persoalan sama ada fungsi tambahan tidak selamat untuk benang untuk kegunaan serentak oleh berbilang goroutin.

Jawapannya: Perlumbaan Data dan Kekurangan Keselamatan Benang

Dalam Go, tiada nilai yang selamat untuk baca/tulis serentak, termasuk hirisan (atau lebih khusus, pengepala hirisan). Apabila berbilang goroutine cuba mengubah suai bahagian yang sama secara serentak, perlumbaan data berlaku, yang berpotensi membawa kepada tingkah laku yang tidak dijangka.

Pengesahan Perlumbaan Data

Anda boleh menjalankan kod anda dengan - pilihan perlumbaan untuk mengesahkan kehadiran perlumbaan data:

go run -race play.go

Penyelesaian: Penyegerakan

Untuk menyelesaikan isu ini dan memastikan ketekalan data, anda perlu menyegerakkan akses kepada kepingan semasa menulis elemen serentak. Ini boleh dicapai menggunakan penyegerakan.Mutex:

var mu = &sync.Mutex{}
destSlice := make([]myClass, 0)

var wg sync.WaitGroup
for _, myObject := range sourceSlice {
    wg.Add(1)
    go func(closureMyObject myClass) {
        defer wg.Done()
        var tmpObj myClass
        tmpObj.AttributeName = closureMyObject.AttributeName
        mu.Lock()
        destSlice = append(destSlice, tmpObj)
        mu.Unlock()
    }(myObject)
}
wg.Wait()

Dengan memperoleh mutex sebelum dilampirkan pada hirisan dan melepaskannya selepas itu, anda memastikan hanya satu goroutine mempunyai akses tulis pada satu masa, menghalang kerosakan data.

Kesimpulan

Semasa menghiris elemen berkelakuan sebagai pembolehubah yang berbeza dan boleh diubah suai secara serentak, pengepala hirisan sememangnya tidak selamat untuk benang. Untuk memastikan operasi tulis serentak yang selamat dan konsisten, adalah penting untuk menggunakan mekanisme penyegerakan seperti mutex atau saluran apabila mengubah suai pengepala kepingan dalam goroutine.

Atas ialah kandungan terperinci Adakah Append Function Thread-Selamat untuk Penggunaan Goroutine Serentak?. 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