>  기사  >  백엔드 개발  >  WaitGroup을 사용하여 동시 goroutine에서 상호 배제를 어떻게 달성할 수 있나요?

WaitGroup을 사용하여 동시 goroutine에서 상호 배제를 어떻게 달성할 수 있나요?

Linda Hamilton
Linda Hamilton원래의
2024-11-01 13:57:02198검색

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

WaitGroup을 사용한 동시 고루틴의 상호 배제

코드에는 실행 중에 서로 간섭 없이 실행해야 하는 3개의 동시 고루틴이 있습니다. 코드의 특정 섹션. 이 개념을 상호 배제라고 하며, 한 번에 하나의 고루틴만 코드의 중요한 섹션을 실행할 수 있도록 보장합니다.

WaitGroup을 사용하여 상호 배제를 달성하려면 다음 단계를 따르세요.

  1. 각 동시 고루틴에 대한 뮤텍스 만들기: 뮤텍스는 한 번에 하나의 고루틴만 잠금을 획득할 수 있도록 하는 잠금 메커니즘입니다. 중요 섹션을 독점적으로 실행해야 하는 각 고루틴에 대해 별도의 뮤텍스를 만듭니다.
  2. 중요 섹션에 들어가기 전에 뮤텍스를 획득하세요. 각 고루틴에서 코드의 중요 섹션을 실행하기 전에 해당 뮤텍스에 대한 Lock() 메서드입니다. 이 작업은 뮤텍스를 획득할 때까지 고루틴을 차단합니다.
  3. 중요 섹션을 떠난 후 뮤텍스를 해제합니다. 임계 섹션 실행을 완료한 후 Unlock()을 호출하여 뮤텍스를 해제합니다. 방법. 이를 통해 다른 고루틴이 뮤텍스를 획득하고 중요한 섹션에 들어갈 수 있습니다.
  4. WaitGroup을 사용하여 완료 대기: 모든 고루틴의 완료를 추적하려면 WaitGroup을 생성하세요. 각 고루틴은 실행이 완료된 후 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>

이 예에서는 , 각 고루틴의 중요한 섹션은 fmt.Println("value of z")을 실행하는 루프입니다. 뮤텍스는 한 번에 하나의 고루틴만 이 섹션을 실행할 수 있도록 보장합니다. WaitGroup은 메인 고루틴이 종료되기 전에 모든 고루틴이 완료될 때까지 기다리도록 합니다.

위 내용은 WaitGroup을 사용하여 동시 goroutine에서 상호 배제를 어떻게 달성할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.