首頁 > 後端開發 > Golang > 主體

如何使用互斥體確保並發 Goroutines 中的互斥?

Patricia Arquette
發布: 2024-10-30 16:38:26
原創
498 人瀏覽過

How to Ensure Mutual Exclusion in Concurrent Goroutines Using Mutexes?

並發Goroutine 中的互斥:實現程式碼隔離

在並發程式設計中,建立防止多個Goroutine 執行的機制至關重要同時使用相同的程式碼。這可以確保資料完整性並防止意外行為。

考慮以下場景:

<code class="go">Routine 1 {
do something

*Send int to Routine 2
Send int to Routine 3
Print Something
Print Something*

do something
}

Routine 2 {
do something

*Send int to Routine 1
Send int to Routine 3
Print Something
Print Something*

do something
}

Routine 3 {
do something

*Send int to Routine 1
Send int to Routine 2
Print Something
Print Something*

do something
}</code>
登入後複製

這裡,當 do some 標記之間的程式碼部分正在執行時,我們希望防止控制流向其他 goroutine。例如,當 Routine1 執行星號內的部分時,Routine2 和 Routine3 應該會被阻止。

透過 WaitGroup 實現互斥

強制互斥的一種方法是使用sync.WaitGroup。然而,這種技術在這種情況下並不適用,因為它缺乏選擇性地阻止 goroutine 的能力。

利用互斥體進行隔離

更有效的解決方案是使用同步.互斥體。互斥體確保在任何給定時間只有一個 Goroutine 可以擁有它。以下是如何使用互斥體來實現互斥:

<code class="go">package main

import (
    "fmt"
    "sync"
)

var (
    mutex1, mutex2, mutex3 sync.Mutex
)

func Routine1() {
    mutex1.Lock()
    // do something
    for i := 0; i < 200; i++ {
        mutex2.Lock()
        mutex3.Lock()
        fmt.Println("value of z")
        mutex2.Unlock()
        mutex3.Unlock()
    }
    // do something
    mutex1.Unlock()
}

func Routine2() {
    mutex2.Lock()
    // do something
    for i := 0; i < 200; i++ {
        mutex1.Lock()
        mutex3.Lock()
        fmt.Println("value of z")
        mutex1.Unlock()
        mutex3.Unlock()
    }
    // do something
    mutex2.Unlock()
}

func Routine3() {
    mutex3.Lock()
    // do something
    for i := 0; i < 200; i++ {
        mutex1.Lock()
        mutex2.Lock()
        fmt.Println("value of z")
        mutex1.Unlock()
        mutex2.Unlock()
    }
    // do something
    mutex3.Unlock()
}

func main() {
    go Routine1()
    go Routine2()
    Routine3()
}</code>
登入後複製

在這段程式碼中:

  • 我們為每個goroutine 定義一個互斥體(mutex1、mutex2、 mutex3)。
  • 在每個 Goroutine(Routine1、Routine2、Routine3)中,我們在開始時鎖定互斥體並在最後解鎖它,保護內部的關鍵部分。
  • 當一個 Goroutine 嘗試鎖定已經存在的互斥體時如果被另一個 goroutine 鎖定,它將阻塞,直到互斥體變得可用。

因此,每個 goroutine 內的 print 語句將一次執行一個,確保沒有其他 goroutine 可以存取這些行,直到當前 Goroutine 已釋放鎖。

以上是如何使用互斥體確保並發 Goroutines 中的互斥?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!