>  기사  >  백엔드 개발  >  뮤텍스에 의해 잠겨 있을 때 지도 객체를 인쇄합니다.

뮤텍스에 의해 잠겨 있을 때 지도 객체를 인쇄합니다.

PHPz
PHPz앞으로
2024-02-10 12:36:09834검색

뮤텍스에 의해 잠겨 있을 때 지도 객체를 인쇄합니다.

PHP 편집기 Xiaoxin은 뮤텍스 잠금에 대한 실용적인 팁, 즉 지도 객체가 뮤텍스 잠금에 의해 잠겨 있을 때 지도 객체를 인쇄하는 방법을 소개하기 위해 왔습니다. 뮤텍스는 한 번에 하나의 스레드만 잠긴 리소스에 액세스할 수 있도록 하여 공유 리소스를 보호하는 데 사용되는 메커니즘입니다. 이 기사에서는 뮤텍스 잠금 사용 및 맵 개체 액세스를 더 잘 이해하기 위해 뮤텍스 잠금을 사용하여 맵 개체를 보호하고 개체가 잠겨 있을 때 맵 콘텐츠를 인쇄하는 방법을 살펴보겠습니다.

질문 내용

왜 뮤텍스가 예상대로 작동하지 않는지 잘 모르겠습니다. 어떤 제안이라도 도움이 될 것입니다.

제 코드입니다.

으아아아

이것을 실행하면 이상한 결과가 나옵니다.

으아아아

일부 로그에서 a 1,2,3,4로 증가할 것으로 예상됩니다

함수에서 inc댓글을 삭제하면; 예상 로그를 볼 수 있습니다.

package main

import (
    "fmt"
    "sync"
    "time"
)

type container struct {
    mu       sync.mutex
    counters map[string]int
}

func (c *container) inc(name string) {
    c.mu.lock()
    defer c.mu.unlock()
    c.counters[name]++
    
    // fmt.println("in", name, c.counters) 
    // this print is doing tricks between goroutines
    time.sleep(time.second)
}

func main() {
    c := container{

        counters: map[string]int{"a": 0, "b": 0},
    }

    var wg sync.waitgroup

    doincrement := func(name string, n int) {
        for i := 0; i < n; i++ {
            c.inc(name)
            fmt.println(name, c.counters)
        }
        wg.done()
    }

    wg.add(3)
    go doincrement("a", 2)
    go doincrement("b", 2)
    go doincrement("a", 2)

    wg.wait()
    fmt.println(c.counters)
}

솔루션

이 루프에서:

으아아아

println은 뮤텍스 외부에서 실행됩니다. 두 개의 고루틴은 동시에 "a"를 증가시키려고 시도하며, 그 중 하나는 증가한 다음 기다립니다. 증분 함수가 반환되면 두 번째 함수가 들어와서 증가하고, 첫 번째 함수의 println이 실행되고, 두 번째 함수의 println이 동일한 내용을 인쇄합니다.

그래서 뮤텍스는 예상대로 작동하지만 뮤텍스로 보호되는 영역 외부에 인쇄하고 있는 것입니다.

위 내용은 뮤텍스에 의해 잠겨 있을 때 지도 객체를 인쇄합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제