>  기사  >  백엔드 개발  >  뮤텍스를 사용하여 동시 고루틴에서 상호 배제를 보장하는 방법은 무엇입니까?

뮤텍스를 사용하여 동시 고루틴에서 상호 배제를 보장하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-30 16:38:26487검색

How to Ensure Mutual Exclusion in Concurrent Goroutines Using Mutexes?

동시 고루틴의 상호 배제: 코드 격리 달성

동시 프로그래밍에서는 여러 고루틴이 실행되는 것을 방지하는 메커니즘을 마련하는 것이 중요합니다. 동일한 코드를 동시에 사용합니다. 이는 데이터 무결성을 보장하고 예상치 못한 동작을 방지합니다.

다음 시나리오를 고려하십시오.

<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 Something 마커 사이의 코드 섹션이 실행되는 동안 제어가 다음으로 흐르는 것을 방지하려고 합니다. 다른 고루틴. 예를 들어 Routine1이 별 내의 부분을 실행하는 경우 Routine2와 Routine3은 차단되어야 합니다.

WaitGroup으로 상호 배제 달성

상호 배제를 시행하는 한 가지 접근 방식은 다음과 같습니다. sync.WaitGroup을 사용하세요. 그러나 이 기술은 고루틴을 선택적으로 차단하는 기능이 부족하기 때문에 이 시나리오에는 적용할 수 없습니다.

격리를 위해 뮤텍스 활용

더 효과적인 솔루션은 동기화를 사용하는 것입니다. .뮤텍스. 뮤텍스는 주어진 시간에 단 하나의 고루틴만이 이를 소유할 수 있도록 보장합니다. 뮤텍스를 사용하여 상호 배제를 구현하는 방법은 다음과 같습니다.

<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>

이 코드에서는

  • 각 고루틴(mutex1, mutex2, mutex3)에 대해 뮤텍스를 정의합니다.
  • 각 고루틴(Routine1, Routine2, Routine3)에서는 처음에 뮤텍스를 잠그고 마지막에 잠금을 해제하여 내부의 중요한 섹션을 보호합니다.
  • 고루틴이 이미 뮤텍스를 잠그려고 시도할 때 다른 고루틴에 의해 잠겨 있으면 뮤텍스를 사용할 수 있을 때까지 차단됩니다.

결과적으로 각 고루틴 내부의 인쇄 문은 한 번에 하나씩 실행되어 다른 고루틴이 그 때까지 해당 행에 액세스할 수 없도록 합니다. 현재 고루틴이 잠금을 해제했습니다.

위 내용은 뮤텍스를 사용하여 동시 고루틴에서 상호 배제를 보장하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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