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

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

DDD
リリース: 2024-10-31 16:36:01
オリジナル
440 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート