ホームページ  >  記事  >  バックエンド開発  >  セマフォは Go のバッファロックをエミュレートできますか?

セマフォは Go のバッファロックをエミュレートできますか?

DDD
DDDオリジナル
2024-11-14 18:37:02285ブラウズ

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。