バッファリングされたロックパターン
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 サイトの他の関連記事を参照してください。