Golang で期限付きのロックを実装するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-11-01 00:40:36
オリジナル
259 人が閲覧しました

How to Implement a Lock with a Deadline in Golang?

Golang で時間制約のあるロックを取得する

Golang でロックを操作する場合、状況によってはロックを取得する必要がある場合があります。直ちに、または何らかの形の期限を遵守してください。標準ライブラリの sync.Mutex は Lock() 関数と Unlock() 関数のみを提供しますが、期限付きロックをエミュレートできる手法があります。

期限付きロックの実装

期限付きのロックを作成するには、バッファ サイズが 1 のチャネルを使用できます:

l := make(chan struct{}, 1)
ログイン後にコピー

ロックするには、構造体の値をチャネルに送信します:

l <- struct{}{}
ログイン後にコピー

ロックを解除するには、チャネルから受信します:

<-l
ログイン後にコピー

Try Lock の実行

Try ロックを試行するには、select ステートメントを使用します:

select {
case l <- struct{}{}:
    // lock acquired
    <-l
default:
    // lock not acquired
}
ログイン後にコピー

このコードは、ロックが利用可能な場合は直ちにロックを取得します。ロックがすでに保持されている場合、select ステートメントはロックが解放されるまでブロックされます。

Try Lock with Timeout

try ロックのタイムアウトを指定するには、次を追加します。 select ステートメントへの time.After() チャネル:

select {
case l <- struct{}{}:
    // lock acquired
    <-l
case <-time.After(time.Minute):
    // lock not acquired
}
ログイン後にコピー

このコードは、最大 1 分間ロックの取得を試みます。タイムアウトが経過すると、select ステートメントは終了し、ロックは取得されません。

結論

バッファ サイズ 1 のチャネルをミューテックスとして使用する期限付きの試行ロックを実装できます。この手法は、ロックを迅速に取得する必要があるシナリオ、または特定の時間枠内にロックを取得する必要があるシナリオで役立ちます。

以上がGolang で期限付きのロックを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!