공식 Go 패키지의 일부인 동기화 패키지에는 다음 명령문이 있습니다.
동기화 패키지는 뮤텍스 잠금과 같은 기본 동기화 프리미티브를 제공합니다. Once 및 WaitGroup 유형을 제외하고 대부분의 다른 유형은 기본 함수 라이브러리용입니다. 더 높은 수준의 동기화는 채널과 통신을 통해 더 잘 수행됩니다.
동시 액세스를 허용하는 대부분의 예에서 많은 사람들이 문제를 해결하기 위해 뮤텍스를 사용합니다. 그러나 채널을 사용하여 동기화 메커니즘을 제공하는 방법을 보여주는 몇 가지 예가 있습니다. 그럼 이번 글에서 다루어 보겠습니다.
뮤텍스 잠금이 작동하려면 공유변수에 접근할 때 잠금이 필요하고, 작업이 완료된 후에는 잠금이 해제되어야 합니다. 경쟁 조건을 피하기 위해 동일한 뮤텍스를 여러 번 잠그는 것은 허용되지 않습니다.
수신자가 없으면 발신자가 차단되고, 발신자가 없으면 수신자가 차단됩니다. 이러한 특성을 기반으로 버퍼링되지 않은 채널을 잠금으로 사용할 수 없습니다.
버퍼 채널을 뮤텍스 잠금으로 사용할 수 있는지 살펴보겠습니다.
버퍼 크기가 1인 채널의 특징은 다음과 같습니다. 버퍼가 가득 차면 버퍼가 비워지면 전송이 차단됩니다. , 전송이 차단됩니다. 차단 해제.
분명히 이 채널의 차단 특성을 뮤텍스 잠금의 특성과 비교해 보세요.
버퍼가 가득 찼을 때71fb34173e4ee87dab1f85dc1c283a44 잠금
버퍼 비워짐71fb34173e4ee87dab1f85dc1c283a44 코드를 통해 기능을 제공합니다.
파일에 써야 하는 이름 열이 있고 각 이름을 1000번 연속으로 써야 한다고 가정하고, 다른 이름의 교차는 허용되지 않습니다.
package main import ( "errors" "fmt" "os" "sync" ) func main() { file, err := os.Create("record.txt") defer func() { if err := recover(); err != nil { fmt.Printf("Error encounter: %w", err) } file.Close() }() if err != nil { panic(errors.New("Cannot create/open file")) } ss := []string{ //string slice literals "James", "Avery", "Peter", "John", "Beau", } chanLock := make(chan int, 1) //1 var wg sync.WaitGroup for _, str := range ss { //2 wg.Add(1) //amended thanks to response from Wang //Sheng go func(aString string) { chanLock <- 1 //3 for i := 0; i < 1000; i++ { file.WriteString(aString + "\n") } <-chanLock //4 wg.Done() //5 }(str) //pass by value } wg.Wait() }
위 코드에서는 //1 버퍼가 1인 채널을 생성합니다. //2 이름 개수만큼 고루틴을 생성했습니다. //3은 잠금과 동일하고 //4는 잠금 해제와 동일하므로 여러 고루틴이 Record.txt 파일에 동기적으로 이름을 쓸 수 있지만 한 번에 하나의 고루틴만 파일을 작동합니다.
WaitGroup을 사용하여 하위 고루틴이 작업을 완료하기 전에 기본 고루틴이 종료되지 않도록 한다는 점에 유의해야 합니다.
이 기사가 도움이 되기를 바랍니다. 코딩을 즐겨보세요!
위 내용은 배웠다! 버퍼링된 채널을 뮤텍스로 사용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!