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 중국어 웹사이트의 기타 관련 기사를 참조하세요!