Heim >Backend-Entwicklung >Golang >Wie kann ich Abstürze beim gleichzeitigen Schreiben von Karten in Go verhindern?

Wie kann ich Abstürze beim gleichzeitigen Schreiben von Karten in Go verhindern?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-14 01:58:09187Durchsuche

How Can I Prevent Concurrent Map Write Crashes in Go?

Verhindern von gleichzeitigen Abstürzen beim Schreiben von Karten

Beim Versuch, gleichzeitig von mehreren Goroutinen aus auf dieselbe Karte zu schreiben, löst Go 1.6 einen absichtlichen Absturz aus, um dies zu verhindern Datenkorruption. Im Gegensatz zu Paniken, die durch die Verwendung von „Defer“ und „Recover“ wiederhergestellt werden können, ist dieser Absturz beabsichtigt und kann nicht abgefangen werden.

Um dieses Problem zu beheben, vermeiden Sie gleichzeitige Schreibvorgänge in Karten. Im bereitgestellten Beispiel:

package main

import "time"

var m = make(map[string]string)

func main() {
    go func() { // Rewrite m["x"] = "foo" in a loop
        for {
            m["x"] = "foo"
        }
    }()
    go func() { // Rewrite m["x"] = "foo" in a loop
        for {
            m["x"] = "bar"
        }
    }()

    time.Sleep(1 * time.Second) // Keep the program running
}

Die gleichzeitigen Schreibvorgänge in die Karte von mehreren Goroutinen verstoßen gegen die Parallelitätsregeln von Go für Karten und verursachen den absichtlichen Absturz.

Um diesen Absturz zu verhindern und die Datenintegrität durchzusetzen, Erwägen Sie die Verwendung eines Mutex- oder Synchronisierungsprimitivs, um den Zugriff auf die Karte zu steuern. Dadurch wird sichergestellt, dass jeweils nur eine Goroutine die Karte ändern kann.

Das obige ist der detaillierte Inhalt vonWie kann ich Abstürze beim gleichzeitigen Schreiben von Karten in Go verhindern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn