>  기사  >  백엔드 개발  >  세마포어가 Go에서 버퍼링된 잠금을 에뮬레이션할 수 있나요?

세마포어가 Go에서 버퍼링된 잠금을 에뮬레이션할 수 있나요?

DDD
DDD원래의
2024-11-14 18:37:02240검색

Can Semaphores Emulate Buffered Locking in Go?

버퍼 잠금 패턴

Go에서 버퍼 채널의 개념은 채널의 버퍼가 채워질 때까지 비차단 작업을 가능하게 합니다. 이 메커니즘에서 영감을 받아 다음과 같은 질문이 제기됩니다. 유한한 클라이언트 집합에 대해 리소스를 잠글 수 있는 "버퍼 잠금"을 위한 버퍼 채널과 유사한 일반화된 패턴이 있습니까?

답변: 세마포

이 요구 사항을 충족하는 프리미티브가 세마포어입니다. 버퍼링된 채널로 구성된 세마포어는 리소스에 액세스할 수 있는 동시 클라이언트 수에 제한을 둡니다.

버퍼링된 채널을 사용하여 다음 구현을 고려하세요.

var semaphore = make(chan struct{}, 4) // allow four concurrent users

func f() {
    // Grab the lock. Blocks as long as 4 other invocations of f are still running.
    semaphore <- struct{}{}

    // Release the lock once we're done.
    defer func() { <-semaphore }()

    // Do work...
}

이 시나리오에서는 , f 함수는 세마포어 채널에 값을 전송하여 잠금을 획득합니다. 허용되는 최대 동시성을 나타내는 채널이 가득 찬 경우 f는 다른 클라이언트가 채널에서 값을 수신하여 잠금을 해제할 때까지 차단됩니다. defer 문은 함수가 반환될 때 잠금이 해제되도록 보장합니다.

위 내용은 세마포어가 Go에서 버퍼링된 잠금을 에뮬레이션할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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