目次
✅例1: atomic.Int64を備えた単純なアトミックカウンター
✅例2: atomic.AddInt64およびatomic.LoadInt64の使用(Pre-Go 1.19スタイル)
✅例3:読み取り(ロード)と書き込み(ストア)を備えたアトミックカウンター
atomic原子なしではどうなりますか?
アトミックカウンターを使用するタイミング
まとめ
ホームページ バックエンド開発 Golang アトミックカウンターは例ごとに進みます

アトミックカウンターは例ごとに進みます

Jul 27, 2025 am 03:27 AM
php java プログラミング

原子カウンターは、人種の状態を避けるために、複数のゴルチンの値を安全に増加または減少または読み取るために使用されます。 GoのSync/Atomicパッケージは、基礎となる原子操作を提供します。 Atomic.int64(Go 1.19)またはAtomic.Addint64/LoadInt64などの関数を使用することをお勧めします。 1. Atomic.int64を使用して、100回のゴルチン10個などの同時自動挿入を安全に達成し、1000の最終結果を達成します。 2。GOの古いバージョンでは、Atomic.Addint64(&Counter、1)およびAtomic.LoadInt64(&Counter)を使用して、同等の関数を実装できます。原子性を確保するためにINTの代わりにINT64を使用することを確認する必要があります。 3.ロードと追加を使用して、監視シナリオでカウンターを安全に読み取り、書き込むことができます。通常のINT変数が同時に直接増加した場合、レース条件がトリガーされ、結果が不正確になり、-go run -raceによって検出されます。アトミックカウンターを使用する必要があるシナリオには、次のものが含まれます。単純な増加と控除チェック操作のみを実行し、高性能を追求し、複雑な共有状態を追求しません。逆に、複数の関連変数を更新する必要がある場合、または代わりに複合ロジックを使用する必要があります。概要:アトミックカウンターは、安全で効率的で、ロックフリーで使いやすいツールです。タイプがINT64であることを確認している限り、非原子操作の混合と-RACEフラグを使用して問題を検出しない限り、クロスゴルーチンカウント要件を正しく効率的に処理できます。

アトミックカウンターは例ごとに進みます

原子カウンターは、人種の状態を引き起こすことなく、複数のゴルチンからの値を安全に増分、減少、または読み取る必要がある場合に使用されます。 GOでは、 sync/atomicパッケージは、 atomic.AddInt64atomic.LoadInt64などを介してint64を使用して、低レベルのアトミック操作、およびatomic.Int64 (go 1.19以降利用可能)またはatomic.Valueを提供します。

アトミックカウンターは例ごとに進みます

アトミックカウンターがどのように機能し、それらを使用するかを示すいくつかの実用的な例を歩きましょう。


✅例1: atomic.Int64を備えた単純なアトミックカウンター

1.19以来、 atomic.Int64 、原子カウンターを管理するためのクリーンでタイプに安全な方法を提供します。

アトミックカウンターは例ごとに進みます
パッケージメイン

輸入 (
    「FMT」
    「同期」
    「同期/アトミック」
    "時間"
))

func main(){
    var counter atomic.int64
    var wg sync.waitgroup

    //各カウンターを100回増やす10ゴルーチンを起動します
    i:= 0; I <10;私 {
        wg.add(1)
        go func(){
            wg.done()を延期する
            j:= 0; J <100; J {
                counter.add(1)
                time.sleep(time.microsecond)//小さな作業をシミュレートします
            }
        }()
    }

    wg.wait()
    fmt.println( "最終カウンター値:"、counter.load())
}

出力:

最終カウンター値:1000

✅これは安全でレースフリーです。ミューテックスは必要ありません。

アトミックカウンターは例ごとに進みます

✅例2: atomic.AddInt64およびatomic.LoadInt64の使用(Pre-Go 1.19スタイル)

古いGOバージョンを使用している場合、または明示的な関数を好む場合:

パッケージメイン

輸入 (
    「FMT」
    「同期」
    「同期/アトミック」
))

func main(){
    varカウンターint64 //原子操作の場合はint64でなければなりません
    var wg sync.waitgroup

    i:= 0; I <5;私 {
        wg.add(1)
        go func(){
            wg.done()を延期する
            j:= 0; J <200; J {
                Atomic.addint64(&counter、1)
            }
        }()
    }

    wg.wait()
    fmt.println( "counter:"、atomic.loadint64(&counter))
}

?注: atomic Packageは特定のサイズで動作し、 intが一部のシステムでは32ビットであるため、 int64intではなく)を使用する必要があります


✅例3:読み取り(ロード)と書き込み(ストア)を備えたアトミックカウンター

値を原子的に安全に読み書きすることもできます。

パッケージメイン

輸入 (
    「FMT」
    「同期/アトミック」
    "時間"
))

func main(){
    varはAtomic.int64を訪問します

    //背景モニターをシミュレートします
    go func(){
        のために {
            time.sleep(500 * time.millisecond)
            fmt.println( "これまでの訪問:"、visits.load())
        }
    }()

    //着信リクエストをシミュレートします
    i:= 0; I <10;私 {
        訪問(1)
        time.sleep(100 * time.millisecond)
    }

    time.sleep(time.second)//モニターを数回監視します
}

これは、他のゴルチンから書いている間、1つのゴルウチンからカウンターを安全に読む方法を示しています。


atomic原子なしではどうなりますか?

ゴルチン全体で通常のintと増分を使用する場合:

 varカウンターint
i:= 0; I <10;私 {
    go func(){
        j:= 0; J <100; J {
            カウンター//?アトミックではありません!レースコンディション!
        }
    }()
}

-raceでこれを実行します:

 Go Run -Race Main.go

レースコンディションの警告が表示され、最終的な値は予想よりも少ない場合があります。


アトミックカウンターを使用するタイミング

Atomic Countersを使用して:

  • 単純な操作を行っています:増分、衰退、追加、ロード、保存。
  • パフォーマンスの問題 - アトミックはミューテックスよりも高速です。
  • 複雑な共有状態は必要ありません(たとえば、複数のフィールドを一緒に更新します)。

Atomicsを避けてください:

  • 複数の関連変数を更新します - 代わりにsync.Mutexを使用します。
  • 複雑なロジックまたは値全体の一貫性が必要です。

まとめ

ゴーのアトミックカウンターは次のとおりです。

  • 同時アクセスのために安全
  • 効率的(ロックなし)
  • atomic.Int64またはatomic.AddInt64 / LoadInt64で使いやすい

覚えておいてください:

  • int64を使用する( intはない)
  • 原子と非原子のアクセスを混ぜないでください
  • -raceフラグを使用して問題を検出します

基本的に、ゴロウチン全体で物事を数えている場合は、 atomic.Int64に到達してください。シンプルで速く、正しいです。

以上がアトミックカウンターは例ごとに進みますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Laravel Lazy Loadingと熱心な読み込み Laravel Lazy Loadingと熱心な読み込み Jul 28, 2025 am 04:23 AM

怠zyな読み込みは、アソシエーションにアクセスするときにクエリのみであり、n 1の問題に簡単につながる可能性があります。これは、関連データが必要かどうかが判断されないシナリオに適しています。 2。()を使用して緊急読み込みを使用して関連データをロードして、バッチ処理シナリオに適したn 1クエリを回避します。 3.緊急荷重を使用してパフォーマンスを最適化する必要があり、N 1の問題はLaraveldebugbarなどのツールを介して検出できます。モデルの属性を備えた$は、不必要なパフォーマンスオーバーヘッドを避けるために慎重に使用されます。

PHPでのオブジェクトリレーショナルマッピング(ORM)パフォーマンスチューニング PHPでのオブジェクトリレーショナルマッピング(ORM)パフォーマンスチューニング Jul 29, 2025 am 05:00 AM

n 1クエリの問題を避け、関連するデータを事前にロードすることにより、データベースクエリの数を減らします。 2.必要なフィールドのみを選択して、メモリと帯域幅を保存するために完全なエンティティをロードしないようにします。 3. DoctrineのセカンダリキャッシュやRedis Cacheの高周波クエリ結果など、キャッシュ戦略を合理的に使用します。 4.エンティティのライフサイクルを最適化し、クリア()を定期的に呼び出してメモリを解放してメモリオーバーフローを防ぎます。 5.データベースインデックスが存在し、生成されたSQLステートメントを分析して、非効率的なクエリを避けます。 6.変更が不要なシナリオで自動変更追跡を無効にし、パフォーマンスを改善するためにアレイまたは軽量モードを使用します。 ORMを正しく使用するには、SQLモニタリング、キャッシュ、バッチ処理、適切な最適化を組み合わせて、開発効率を維持しながらアプリケーションのパフォーマンスを確保する必要があります。

PHPの内部ガベージコレクションメカニズムに深く潜ります PHPの内部ガベージコレクションメカニズムに深く潜ります Jul 28, 2025 am 04:44 AM

PHPのゴミ収集メカニズムは参照カウントに基づいていますが、周期的な円形のゴミコレクターによって円形の参照を処理する必要があります。 1。変数への参照がない場合、参照カウントはすぐにメモリを解放します。 2.参照参照により、メモリを自動的にリリースできなくなり、GCを検出およびクリーニングすることがGCに依存します。 3。GCは、「可能なルート」ZVALがしきい値に到達するか、GC_COLLECT_CYCLES()を手動で呼び出すとトリガーされます。 4.長期実行PHPアプリケーションは、メモリの漏れを避けるために、gc_status()を監視し、gc_collect_cycles()を呼び出す必要があります。 5.ベストプラクティスには、gc_disable()を使用してパフォーマンスキー領域を最適化し、ormのclear()メソッドを介して繰り返しのオブジェクトを最適化する回路参照の回避が含まれます。

サーバーレス革命:BREFを使用してスケーラブルなPHPアプリケーションを展開します サーバーレス革命:BREFを使用してスケーラブルなPHPアプリケーションを展開します Jul 28, 2025 am 04:39 AM

BREFにより、PHP開発者は、サーバーを管理せずにスケーラブルで費用対効果の高いアプリケーションを構築できます。 1.Brefは、最適化されたPHPランタイムレイヤーを提供し、PHP8.3およびその他のバージョンをサポートし、LaravelやSymfonyなどのフレームワークとシームレスに統合することにより、PHPをAwslambdaにもたらします。 2。展開手順には、次のものが含まれます。Composerを使用してBREFのインストール、httpエンドポイントや職人コマンドなどの関数とイベントを定義するためにserverless.ymlの構成。 3. serverlessdeployコマンドを実行して、展開を完了し、Apigatewayを自動的に構成し、アクセスURLを生成します。 4。Lambdaの制限については、Brefは解決策を提供します。

Laravel Octaneとは何ですか? Laravel Octaneとは何ですか? Jul 28, 2025 am 04:12 AM

laraveloctaneisaperformance-boostingpackageThatimeThimeTimeTimeStrougpuptinvinglaravelApplicationsviaswoole、openswoole、Orroadrunner.1.unliketraditionalphp-fpm、whithotslaravaloneboreRerequest、オクタンロアドスセポン科学エプスムーエルンメイムーエルンメイターム

PHPを機械学習モデルと統合します PHPを機械学習モデルと統合します Jul 28, 2025 am 04:37 AM

usearestapitobridgephpandmlmodelsbyrunningthemodelinpythonviaflaskorapiandapiandcallingtfromphpusingcurlorguzzle.2.runpythosscriptsdirectlyfrompurspusingec()orshell_exec()

Readonlyプロパティを備えたPHPに不変のオブジェクトを構築します Readonlyプロパティを備えたPHPに不変のオブジェクトを構築します Jul 30, 2025 am 05:40 AM

readonlypropertiesinphp8.2canonlybeassignedonedonedontheconstructoraturatiddeclaration andcannotBemodifiedifiedifiedifiedifiedifiedifiedifiadtivedabilityattthelanguagelele.2.

Laravel Octaneとは何ですか、いつ役に立ちますか? Laravel Octaneとは何ですか、いつ役に立ちますか? Jul 28, 2025 am 04:13 AM

laraveloctaneisusefulfor forpporformancein-high-raffic、low-latency、orreal-timeapplicationsbykeepingthelaravelframeworkdinmemoryusingswooleorroadrunner.1.itexcelsinhigh-trafficapplicationsbyreducingserverlolowandapsimethroughthroughthroughthroughthroughtheTimethroughthedroughtunetingは

See all articles