Rumah > pembangunan bahagian belakang > Golang > Adakah Kata Kunci `julat` Go Selamat untuk Akses Peta Serentak?

Adakah Kata Kunci `julat` Go Selamat untuk Akses Peta Serentak?

Barbara Streisand
Lepaskan: 2024-12-07 04:54:16
asal
554 orang telah melayarinya

Is Go's `range` Keyword Safe for Concurrent Map Access?

Akses Serentak ke Peta dengan 'julat' dalam Go

Dalam entri blog "Go maps in action", dokumentasi menyatakan bahawa memetakan tidak selamat untuk kegunaan serentak tanpa mekanisme penyegerakan seperti penyegerakan.RWMutex. Walau bagaimanapun, tidak jelas sama ada akses melalui lelaran julat membentuk "baca" atau jika kata kunci julat mempunyai keperluan penguncian khusus.

Keselarasan julat

Ungkapan julat ialah dinilai sekali sebelum gelung bermula. Untuk peta, ini bermakna pembolehubah peta (cth., testMap) hanya dinilai sekali, walaupun pasangan nilai kunci baharu boleh ditambah atau dialih keluar semasa lelaran. Pemisahan antara penilaian awal dan lelaran itu sendiri membayangkan bahawa peta tidak diakses oleh pernyataan for semasa melaksanakan lelaran.

Lelaran Selamat

Oleh itu, perkara berikut lelaran selamat untuk akses serentak:

func IterateMapKeys(iteratorChannel chan int) error {
    testMapLock.RLock()
    defer testMapLock.RUnlock()
    mySeq := testMapSequence
    for k, _ := range testMap {
        ....
    }
    return nil
}
Salin selepas log masuk

Reka bentuk ini memastikan peta dikunci hanya apabila perlu, sambil membenarkan akses serentak kepada gorouti lain.

Pengubahsuaian Serentak

Walau bagaimanapun, penguncian jenis ini hanya menghalang akses serentak, bukan pengubahsuaian serentak. Ada kemungkinan goroutine lain memperoleh kunci tulis dan mengubah suai peta walaupun semasa lelaran sedang berjalan. Untuk mengelakkan ini, peta harus kekal dikunci sepanjang lelaran.

Contoh

Contoh ini menunjukkan perbezaan antara membuka kunci dan mengunci dalam blok untuk:

func IterateMapKeys(iteratorChannel chan int) error {
    testMapLock.RLock()
    defer testMapLock.RUnlock()
    mySeq := testMapSequence
    for k, _ := range testMap {
        testMapLock.RUnlock()
        ....
        testMapLock.RLock()
        ....
    }
    return nil
}
Salin selepas log masuk

Dalam contoh ini, melepaskan kunci baca dalam blok untuk membolehkan pengubahsuaian dan potensi serentak ralat.

Kesimpulan

Kata kunci julat itu sendiri tidak menyediakan penyegerakan untuk akses serentak kepada peta. Menggunakan mekanisme penyegerakan yang betul (cth., penyegerakan.RWMutex) adalah penting untuk memastikan keselamatan lelaran dan pengubahsuaian serentak.

Atas ialah kandungan terperinci Adakah Kata Kunci `julat` Go Selamat untuk Akses Peta Serentak?. 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