高度な同時実行システムのグローバル カウンタ
質問:高度な同時実行システムで重複することなく複数の goroutine によってアクセスされますか?
前の質問を参照して、チャネル カウンターを使用しようとしていると述べましたが、これは一般に共有カウンターには推奨されません。一部のシナリオでは機能する可能性がありますが、同時実行性が高い状況では問題が発生します。
答え:
1.アトミック パッケージ:
共有カウンターを実装するための最も効果的なアプローチは、Go が提供するアトミック パッケージを使用することです。アトミック操作により、共有データへの変更が 1 つの分割できないアクションとして確実に実行され、競合状態が効果的に防止されます。
例:
<code class="go">import "sync/atomic" var globalCounter int32 = 0 // Atomically updated counter func IncrementCounter() { atomic.AddInt32(&globalCounter, 1) // Atomically increments the counter } func ReadCounter() int32 { return atomic.LoadInt32(&globalCounter) // Atomically reads the counter's value }</code>
2.同期チャネル:
もう 1 つのオプションは、同期チャネルを使用してカウンター値を共有することです。ただし、このアプローチは効率が低く、さらに複雑になります。
例:
<code class="go">var counter chan int = make(chan int, 1) func IncrementCounter() { counter <- 1 } func ReadCounter() int { return <-counter }</code>
提供されたコード スニペットでは、値交換用のチャネルを利用してスレッドセーフ カウンターを実装しています。 。ただし、値をリセットするためのスレッドセーフな操作も考慮する必要があります。適切な実装は次のようになります:
<code class="go">var addCounterChan chan int = make(chan int, 100) var readCounterChan chan int = make(chan int, 100) func AddCounter() { addCounterChan <- 1 } func GetCount() int { return <-readCounterChan }</code>
以上が同時実行性の高い Go システムにスレッドセーフなグローバル カウンターを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。