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

如何使用 WaitGroup 在並發 goroutine 中實現互斥?

Linda Hamilton
發布: 2024-11-01 13:57:02
原創
207 人瀏覽過

How can I achieve mutual exclusion in concurrent goroutines using WaitGroup?

使用WaitGroup 實現並發Goroutine 的互斥

在你的程式碼中,你有3 個並發Goroutine,它們需要在不互互互互互互無互幹擾的情況下執行他們程式碼的特定部分。這個概念稱為互斥,它確保一次只有一個 goroutine 可以執行程式碼的關鍵部分。

要使用WaitGroup 實現互斥,可以按照以下步驟操作:

  1. 為每個並發Goroutine 創建互斥體:互斥體是一種鎖定機制,一次只允許一個Goroutine 取得鎖。為每個需要獨佔執行其臨界區的 goroutine 創建一個單獨的互斥體。
  2. 進入臨界區之前取得互斥體:在每個 goroutine 中執行臨界區程式碼之前,呼叫對應互斥鎖上的 Lock() 方法。此操作將阻塞 goroutine,直到取得互斥鎖。
  3. 離開臨界區後釋放互斥鎖:完成臨界區執行後,透過呼叫 Unlock() 釋放互斥鎖方法。這允許其他 goroutine 獲取互斥體並進入其臨界區。
  4. 使用 WaitGroup 等待完成: 建立一個 WaitGroup 來追蹤所有 goroutine 的完成情況。每個goroutine在完成執行後應該呼叫WaitGroup的Done()方法。主協程應該使用 WaitGroup 的 Wait() 方法等待所有協程完成。

以下是實現上述步驟的範例:

<code class="go">package main

import (
    "fmt"
    "sync"
)

var (
    mutex1 sync.Mutex
    mutex2 sync.Mutex
    mutex3 sync.Mutex
    wg     sync.WaitGroup
)

func Routine1() {
    mutex1.Lock()
    defer mutex1.Unlock()

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

func Routine2() {
    mutex2.Lock()
    defer mutex2.Unlock()

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

func Routine3() {
    mutex3.Lock()
    defer mutex3.Unlock()

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

func main() {
    wg.Add(3)
    go Routine1()
    go Routine2()
    go Routine3()
    wg.Wait()
}</code>
登入後複製

在此範例中,每個goroutine 的關鍵部分是執行fmt.Println("value of z")的循環。互斥體確保一次只有一個 goroutine 可以執行此部分。 WaitGroup 確保主 goroutine 在退出之前等待所有 goroutine 完成。

以上是如何使用 WaitGroup 在並發 goroutine 中實現互斥?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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