Heim  >  Artikel  >  Backend-Entwicklung  >  Integrierte Sperren und Mutexe in der Go-Sprache

Integrierte Sperren und Mutexe in der Go-Sprache

王林
王林Original
2023-06-01 08:06:26665Durchsuche

Integrierte Sperren und Mutexe in der Go-Sprache

Mit der Popularität von Multi-Core-Prozessoren ist Multithread-Programmierung zu einem unverzichtbaren Bestandteil der Anwendungsentwicklung geworden. Bei der Multithread-Programmierung sind Sperren ein wichtiger Mechanismus zur Steuerung des gleichzeitigen Zugriffs auf gemeinsam genutzte Ressourcen. Die Go-Sprache bietet eine Fülle von Sperrmechanismen, von denen die am häufigsten verwendeten integrierten Sperren und Mutexe sind.

Bring Your Own Lock

Bring Your Own Lock ist ein Sperrmechanismus in der Go-Sprache, der leicht, einfach zu bedienen und leistungsstark ist. Die integrierte Sperre ist eine Variable mit Konkurrenzbedingungen. Das heißt, wenn mehrere Threads gleichzeitig auf die Variable zugreifen, ist eine Synchronisierung erforderlich, um inkonsistente Ergebnisse zu vermeiden.

In der Go-Sprache können Synchronisierungsvorgänge einfach mithilfe der integrierten Sperre durchgeführt werden. Die integrierte Sperre verfügt über zwei wichtige Methoden: Lock() und Unlock(). Die Lock()-Methode wird zum Erlangen der Sperre verwendet. Wenn die Sperre bereits von anderen Threads belegt ist, wechselt der aufrufende Thread in einen blockierenden Zustand Damit die Sperre aufgehoben wird, wird die Unlock()-Methode verwendet, um die Sperre aufzuheben.

Beispiel für die Verwendung einer integrierten Sperre:

var mu sync.Mutex  // 定义一个锁变量
var count int

func main() {
    for i := 0; i < 1000; i++ {
        go add()  // 启动1000个线程,对count进行加1操作
    }
    time.Sleep(time.Second)  // 等待所有线程执行完成
    fmt.Println(count)  // 打印最终结果
}

func add() {
    mu.Lock()  // 获取锁
    count++  // 对共享变量进行操作
    mu.Unlock()  // 释放锁
}

Im obigen Code wird eine globale Variablenanzahl als gemeinsam genutzte Ressource verwendet und durch Starten von 1000 Threads um 1 erhöht. Um sicherzustellen, dass der gleichzeitige Zugriff auf die Zählvariable keine Race Conditions verursacht, wird eine integrierte Sperre zur Synchronisierung verwendet. Rufen Sie in der Funktion add() zunächst die Methode mu.Lock() auf, um die Sperre zu erhalten, die gemeinsam genutzte Ressource zu betreiben und dann die Sperre über die Methode mu.Unlock() aufzuheben. Dadurch wird sichergestellt, dass die Operation an der Zählvariablen atomar ist und Rennbedingungen vermieden werden.

Mutex

Mutex ist ein weiterer Sperrmechanismus in der Go-Sprache, der auch zum Schutz gemeinsam genutzter Ressourcen verwendet wird. Mutexe ähneln integrierten Sperren und können verwendet werden, um das Auftreten von Race-Conditions zu verhindern. Im Vergleich dazu können Mutexe jedoch Vorgänge auf feinkörnigeren Codeblöcken sperren und entsperren.

Die Verwendung von Mutex ähnelt einer eigenen Sperre. In der Go-Sprache ist der Mutex-Typ sync.Mutex und der Prototyp lautet wie folgt:

type Mutex struct {
    // 包含Mutex的内部结构
}

func (m *Mutex) Lock() {
    // 加锁操作
}

func (m *Mutex) Unlock() {
    // 解锁操作
}

Bei Verwendung eines Mutex müssen Sie auch Codeblöcke hinzufügen, die zwischen Lock() und Unlock() synchronisiert werden müssen Methoden zur Gewährleistung der gemeinsamen Nutzung der Korrektheit der Ressourcen.

Beispiel für die Verwendung eines Mutex:

var mu sync.Mutex  // 定义一个互斥量
var count int

func main() {
    for i := 0; i < 1000; i++ {
        go add()  // 启动1000个线程,对count进行加1操作
    }
    time.Sleep(time.Second)  // 等待所有线程执行完成
    fmt.Println(count)  // 打印最终结果
}

func add() {
    mu.Lock()  // 获取锁
    count++  // 对共享变量进行操作
    mu.Unlock()  // 释放锁
}

Ähnlich wie bei der Verwendung integrierter Sperren wird im obigen Code ein Mutex verwendet, um den Zugriff auf die Anzahl der gemeinsam genutzten Ressourcen zu synchronisieren.

Zusammenfassung

Integrierte Sperren und Mutexe sind gängige Synchronisierungsmechanismen in der Go-Sprache, die dazu dienen, gemeinsam genutzte Ressourcen vor gleichzeitigen Änderungen zu schützen. Die eingebaute Sperre eignet sich zum Sperren und Entsperren des gesamten Codeblocks, während der Mutex zum Sperren und Entsperren von detaillierteren Codeblöcken verwendet werden kann. In der tatsächlichen Entwicklung sollte der geeignete Sperrmechanismus entsprechend den spezifischen Anforderungen ausgewählt werden, um die Zuverlässigkeit und Parallelität des Programms sicherzustellen.

Das obige ist der detaillierte Inhalt vonIntegrierte Sperren und Mutexe in der Go-Sprache. 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