ホームページ  >  記事  >  バックエンド開発  >  同時実行性の高い Go システムにスレッドセーフなグローバル カウンターを実装するにはどうすればよいですか?

同時実行性の高い Go システムにスレッドセーフなグローバル カウンターを実装するにはどうすればよいですか?

DDD
DDDオリジナル
2024-10-31 16:36:01329ブラウズ

How to Implement a Thread-Safe Global Counter in a Highly Concurrent Go System?

高度な同時実行システムのグローバル カウンタ

質問:高度な同時実行システムで重複することなく複数の 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 サイトの他の関連記事を参照してください。

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