>  기사  >  백엔드 개발  >  동시 고루틴에서 상호 배제를 달성하기 위해 Mutex Lock을 어떻게 사용할 수 있습니까?

동시 고루틴에서 상호 배제를 달성하기 위해 Mutex Lock을 어떻게 사용할 수 있습니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-01 17:43:30123검색

How can Mutex Locks be used to achieve Mutual Exclusion in Concurrent Goroutines?

뮤텍스 잠금을 사용한 동시 고루틴의 상호 제외

코드에서 각 고루틴의 특정 코드 섹션이 격리되어 실행되는지 확인하려고 합니다. . 이는 다른 고루틴에 의한 이러한 섹션의 동시 실행을 방지합니다. 다음은 뮤텍스 잠금을 사용하여 상호 배제를 달성할 수 있는 방법입니다.

제공된 코드 개요는 고루틴의 흐름과 상호 배제의 필요성을 보여줍니다. 하나의 고루틴에서 특정 이벤트가 실행되는 동안 실행이 다른 고루틴으로 전달되는 것을 방지하고 싶습니다.

이를 구현하려면 뮤텍스 잠금을 사용할 수 있습니다. 뮤텍스는 주어진 시간에 단 하나의 고루틴만이 공유 리소스에 액세스할 수 있도록 보장합니다. 다음은 상호 배제를 위해 뮤텍스를 활용하는 코드의 약간 수정된 버전입니다.

<code class="go">package main

import (
    "fmt"
    "rand"
    "sync"
)

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

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()
    wg.Done()
}

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()
    wg.Done()
}

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()
    wg.Done()
}

func main() {
    wg.Add(3)
    go Routine1()
    go Routine2()
    Routine3()
    wg.Wait()
}</code>

이 업데이트된 코드가 상호 배제를 달성하는 방법은 다음과 같습니다.

  1. 각 고루틴에 대해 뮤텍스 잠금이 생성됩니다. (뮤텍스1, 뮤텍스2, 뮤텍스3).
  2. 고루틴이 임계 섹션(상호 배제가 필요한 곳)에 액세스해야 할 때 해당 뮤텍스를 잠급니다.
  3. 뮤텍스는 다음에 의해 잠깁니다. 하나의 고루틴, 동일한 뮤텍스에 액세스하려는 다른 고루틴은 잠금이 해제될 때까지 차단됩니다.
  4. 중요 섹션이 완료되면 고루틴은 뮤텍스의 잠금을 해제하여 다른 고루틴이 이에 액세스할 수 있도록 합니다.

이 구현은 각 고루틴의 지정된 코드 섹션이 독립적으로 실행되도록 보장하여 다른 고루틴의 동시 실행을 방지합니다.

위 내용은 동시 고루틴에서 상호 배제를 달성하기 위해 Mutex Lock을 어떻게 사용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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