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
Barbara Streisandasal
2024-12-07 04:54:16616semak imbas

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
}

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
}

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!

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