Go で時間制限付きロックを取得しようとしています
Go では、組み込みの sync.Mutex は Lock() のみを提供します。および Unlock() メソッド。ただし、すぐに中止するか、期限を守って、期限付きでロックの取得を試行できると有益なシナリオもあります。
問題ステートメント
次のシナリオを考えてみましょう:
解決策: チャネルベースのミューテックス
期限付きでロックを取得する簡単な解決策は次のとおりです。バッファ サイズ 1 のチャネルをミューテックスとして使用します。
実装
<code class="go">l := make(chan struct{}, 1) // Lock: send a struct to the channel l <- struct{}{} // Unlock: receive a struct from the channel <-l</code>
Try Lock
ロックの取得を試行するには、次のコードを使用します:
<code class="go">select { case l <- struct{}{}: // Lock acquired defer <-l default: // Lock not acquired }</code>
タイムアウトで試行
タイムアウトでロックの取得を試行するには、次のコードを使用します:
<code class="go">select { case l <- struct{}{}: // Lock acquired defer <-l case <-time.After(time.Minute): // Lock not acquired }</code>
結論
チャネルベースのアプローチを利用することで、Go でタイムアウトを伴う取得試行をサポートするロックを実装することができ、ロック シナリオをより柔軟に処理できるようになります。時間の制約があります。
以上がGo で時間制限付きロックを実装するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。