>백엔드 개발 >Golang >배웠다! 버퍼링된 채널을 뮤텍스로 사용

배웠다! 버퍼링된 채널을 뮤텍스로 사용

Golang菜鸟
Golang菜鸟앞으로
2023-08-08 16:21:141369검색


공식 Go 패키지의 일부인 동기화 패키지에는 다음 명령문이 있습니다.

동기화 패키지는 뮤텍스 잠금과 같은 기본 동기화 프리미티브를 제공합니다. Once 및 WaitGroup 유형을 제외하고 대부분의 다른 유형은 기본 함수 라이브러리용입니다. 더 높은 수준의 동기화는 채널과 통신을 통해 더 잘 수행됩니다.

동시 액세스를 허용하는 대부분의 예에서 많은 사람들이 문제를 해결하기 위해 뮤텍스를 사용합니다. 그러나 채널을 사용하여 동기화 메커니즘을 제공하는 방법을 보여주는 몇 가지 예가 있습니다. 그럼 이번 글에서 다루어 보겠습니다.

뮤텍스 잠금의 특징

뮤텍스 잠금이 작동하려면 공유변수에 접근할 때 잠금이 필요하고, 작업이 완료된 후에는 잠금이 해제되어야 합니다. 경쟁 조건을 피하기 위해 동일한 뮤텍스를 여러 번 잠그는 것은 허용되지 않습니다.

버퍼링되지 않은 채널과 단점

수신자가 없으면 발신자가 차단되고, 발신자가 없으면 수신자가 차단됩니다. 이러한 특성을 기반으로 버퍼링되지 않은 채널을 잠금으로 사용할 수 없습니다.

버퍼 채널을 뮤텍스 잠금으로 사용할 수 있는지 살펴보겠습니다.

버퍼 크기가 1인 채널의 특징 및 장점

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

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