ホームページ > バックエンド開発 > Golang > Go でバッファー ロックを実装するためにバッファー チャネルを使用できますか?

Go でバッファー ロックを実装するためにバッファー チャネルを使用できますか?

Susan Sarandon
リリース: 2024-11-16 22:39:03
オリジナル
810 人が閲覧しました

Can Buffered Channels Be Used for Implementing Buffered Locking in Go?

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...
}
ログイン後にコピー

この例では、4 つの要素 (make(chan struct{}, 4) を持つバッファリングされたチャネル) ) はセマフォとして機能します。 f 関数は、チャネルに値を送信してロックを取得します。チャネルがいっぱいの場合、関数は値を受信するまでブロックされます。ロックが取得されると、defer ステートメントによって、関数が戻ったときにロックが確実に解放されます。

バッファーされたチャネルで実装されたセマフォを使用することで、リソースへのアクセスを制限された数に制限するバッファーされたロック パターンを作成できます。同時ユーザー数。

以上がGo でバッファー ロックを実装するためにバッファー チャネルを使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート