Rumah >pembangunan bahagian belakang >Golang >Mengapakah `recover` Gagal Mengendalikan Ranap Pengubahsuaian Peta Serentak dalam Go?

Mengapakah `recover` Gagal Mengendalikan Ranap Pengubahsuaian Peta Serentak dalam Go?

Barbara Streisand
Barbara Streisandasal
2024-12-17 09:11:25432semak imbas

Why Does `recover` Fail to Handle Concurrent Map Modification Crashes in Go?

Mengendalikan Pengubahsuaian Peta Serentak: Dilema Recover vs. Runtime Crash

Apabila berurusan dengan akses peta serentak, seseorang mungkin menghadapi situasi pelik di mana pulih daripada panik "baca peta dan tulis peta serentak" nampaknya sia-sia. Ini kerana tingkah laku masa jalan dalam kes sedemikian bukanlah panik tetapi ranap yang disengajakan.

Dalam Go 1.6, masa jalanan memperkenalkan mekanisme pengesanan untuk penyalahgunaan peta secara serentak. Jika berbilang goroutin cuba mengubah suai peta secara serentak, masa jalan mencetuskan ranap, mencetak mesej diagnostik. Tingkah laku ini berpunca daripada bahaya yang wujud dari potensi tingkah laku yang tidak ditentukan apabila peta diakses secara serentak untuk operasi tulis.

Malangnya, pendekatan biasa menggunakan tangguh dengan pulih untuk mengendalikan panik tidak berkesan dalam senario ini. Fungsi pulih tidak boleh memintas ranap yang dimulakan oleh masa jalan. Penyelesaian yang disyorkan adalah untuk mengelakkan penyalahgunaan serentak peta sama sekali.

Dalam contoh yang disediakan:

package main

import "time"

var m = make(map[string]string)

func main() {
    go func() {
        for {
            m["x"] = "foo"
        }
    }()
    go func() {
        for {
            m["x"] = "foo"
        }
    }()

    time.Sleep(1 * time.Second)
}

Tulisan serentak pada peta "m" akan mencetuskan ranap masa jalan. Untuk mengelakkan ini, seseorang perlu menggunakan mekanisme penyegerakan, seperti menggunakan mutex atau saluran, untuk memastikan akses eksklusif kepada peta semasa operasi tulis.

Atas ialah kandungan terperinci Mengapakah `recover` Gagal Mengendalikan Ranap Pengubahsuaian Peta Serentak 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