C++ でのアトミック変数 (std::atomic) の使用ガイド

C++ でのアトミック変数 (std::atomic) の使用ガイド

アトミック変数 ( std::atomic) は、マルチスレッド プログラミング用の C++ の強力なツールの 1 つです。これらは、明示的なミューテックス ロックを使用せずに、共有データにアクセスして変更するためのスレッドセーフな方法を提供します。std::atomicこの記事では、入門レベルの読者に適した、基本概念、使用方法、一般的なアプリケーション シナリオ、およびサンプル コードを紹介します。

基本的な考え方

アトミック変数は、アトミック操作を実行するために使用される特別なデータ型です。アトミック操作は、マルチスレッド環境でスレッドセーフな実行を保証する分割不可能な操作です。C++ はstd::atomicアトミック操作のサポートを提供します。

std::atomic整数、ブール値、ポインターなどのさまざまなデータ型をサポートします。オブジェクトを作成しstd::atomic、アトミック操作を使用してその値を読み取り、変更できます。

説明書

アトミック変数を作成する

変数を作成するにはstd::atomic、変数の型をstd::atomic先頭に追加して初期化します。

std::atomic<int> atomicInt(0);
std::atomic<bool> atomicBool(true);

読み取り値

std::atomic変数の値を読み取るには、load次の関数を使用できます。

int value = atomicInt.load();
bool flag = atomicBool.load();

値の変更

std::atomic変数の値を変更するには、store次の関数を使用できます。

atomicInt.store(42);
atomicBool.store(false);

アトミック操作

std::atomicexchangeさまざまなアトミック操作を実行するための、compare_exchange_weakcompare_exchange_strongfetch_add、などの一連のアトミック操作関数を提供しますfetch_sub

fetch_add以下を使用してアトミックな追加操作を実行する方法を示す例を次に示します。

std::atomic<int> atomicValue(0);
int increment = 5;
int result = atomicValue.fetch_add(increment);

一般的なアプリケーションシナリオ

1. カウンター

アトミック変数は、特にマルチスレッド環境でカウンターを実装する場合に非常に役立ちます。と を使用するfetch_addと、fetch_subカウンタの値を安全に増減できます。

std::atomic<int> counter(0);

// 线程1增加计数器
counter.fetch_add(1);

// 线程2减少计数器
counter.fetch_sub(1);

2. 制御フラグ

std::atomic<bool>変数は、スレッドの開始と停止を制御するためによく使用されます。loadと を使用してstore、フラグのステータスを読み取り、変更できます。

std::atomic<bool> flag(true);

// 线程1检查标志
if (flag.load()) {
    
    
    // 执行操作
}

// 线程2修改标志
flag.store(false);

3. リンクリストとデータ構造

同時データ構造では、データの整合性を確保し、競合状態を回避するためにアトミック操作が重要です。アトミック変数を使用して、ロック、条件変数、その他の同期メカニズムを実装できます。

サンプルコード

これを C++ で使用する方法を示す簡単な例を次に示しますstd::atomic

#include <iostream>
#include <thread>
#include <atomic>

std::atomic<int> atomicCounter(0);

void incrementCounter() {
    
    
    for (int i = 0; i < 10000; ++i) {
    
    
        atomicCounter.fetch_add(1);
    }
}

int main() {
    
    
    std::thread t1(incrementCounter);
    std::thread t2(incrementCounter);

    t1.join();
    t2.join();

    std::cout << "Final Counter Value: " << atomicCounter.load() << std::endl;

    return 0;
}

この例では、明示的なミューテックス ロックを必要とせずに、2 つのスレッドが同時にアトミック カウンタをインクリメントします。

結論は

std::atomicこれは、C++ でマルチスレッド プログラミングを処理するための強力なツールであり、共有データにアクセスして変更するためのスレッドセーフな方法を提供します。適切に使用するとstd::atomic、競合状態やデータ競合を回避でき、より堅牢なマルチスレッド アプリケーションを作成できるようになります。この記事が、std::atomicマルチスレッド プロジェクトでの使用を開始するのに役立つことを願っています。

おすすめ

転載: blog.csdn.net/qq_46017342/article/details/132838649