ホームページ >バックエンド開発 >Golang >Go にはバッファリングされたチャネルと同様のバッファリングされたロック パターンはありますか?

Go にはバッファリングされたチャネルと同様のバッファリングされたロック パターンはありますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-25 17:01:12264ブラウズ

Is There a Buffered Locking Pattern in Go Similar to Buffered Channels?

Go のバッファリング ロック パターン

Go では、バッファリングされたチャネルにより、バッファがいっぱいになるまでブロックせずに通信を継続できます。しかし、特定の数のクライアントへのリソース アクセスを制限するバッファリング ロックの同様のパターンはありますか?

リソースへの同時アクセスを管理するためのプリミティブは、セマフォです。セマフォはバッファ付きチャネルを使用して簡単に実装できます。

例を示します:

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

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

    // Release the lock when the function is done.
    defer func() { <-semaphore }()

    // Perform the intended operations...
}

この例では、サイズ 4 のバッファを持つセマフォが semaphore := make( chan 構造体{}、4)。 f() 関数は、空の構造体をチャネルに送信してロックを取得しようとします。チャネル バッファーがいっぱいの場合 (つまり、f() の 4 つの同時インスタンスがすでに実行されている場合)、セマフォ <- struct{}{} の呼び出しは、ロックが利用可能になるまでブロックされます。

関数が終了したときそのタスクでは、チャネルから空の構造体を取得することでロックを解放します (-

このパターンは、共有リソースへのアクセスを特定の数の同時クライアントに制限する便利な方法を提供し、潜在的なリソース競合の問題を防ぎます。

以上がGo にはバッファリングされたチャネルと同様のバッファリングされたロック パターンはありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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