「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go でスレッドセーフなグローバル カウンターを実装するにはどうすればよいですか?

Go でスレッドセーフなグローバル カウンターを実装するにはどうすればよいですか?

2024 年 12 月 21 日に公開
ブラウズ:783

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

同時システムでのカウンターの一意性の確保

共有リソースにアクセスするマルチスレッド環境では、グローバル変数の一意性を確保することが重要になります。グローバル カウンターのチャネル カウンターを利用するコード スニペットでは、同時リクエスト中に割り当てられた番号が重複する可能性があるという懸念が生じます。

これに対処するには、参照された質問で受け入れられた回答では、sync.Mutex などのロック メカニズムを使用することを提案しています。カウンタ更新時のスレッドの安全性のため。ただし、同等またはそれ以上のパフォーマンスを提供する代替ソリューションがあります。

アトミック パッケージ: より良い選択

この場合、アトミック パッケージが際立っています。グローバル共有カウンターを実装するための最も効率的なオプション。整数を含むいくつかの一般的なデータ型に対するアトミック操作を提供します:

var globalCounter *int32 = new(int32)

// ...

// Atomically increment the global counter
currentCount := atomic.AddInt32(globalCounter, 1)

このアプローチを使用すると、カウンターのアトミックな増分を保証し、割り当てが重複する可能性を排除できます。これにより、各ゴルーチンが確実に一意の番号を取得できるようになります。

追加の考慮事項

指定したコード スニペットに関しては、追加のチャネル (addCounterChan および readCounterChan) とゴルーチンが導入されています。カウンターを更新します。この実装はカウンターの読み取りとリセットに関してスレッドセーフであるように見えますが、完全に堅牢であるわけではありません。適切な同期がないと、競合状態やデータ破損のリスクがあります。

正しいアプローチ

Go でスレッドセーフなグローバル カウンターを作成するには、次の方法が推奨されます。グローバル整数値に対してアトミック パッケージのアトミックにインクリメントする操作を使用します。これにより、特定の要件に対して最も効率的で信頼性の高いソリューションが提供されます。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3