std::atomic (c++11)

std::atomic です。セマフォなどを使用しないでスレッド間の変数同期を行います。
今後はこちらの実装が主流になるかな?

 

 

評価環境

 

テストプログラム

10個のスレッドを同時起動して、通常のグローバル変数と atomic 変数を各スレッドから同期処理なしでインクリメントした場合の動作を確認してみます。

 

#include <iostream>     // cout
#include <vector>       // vector
#include <thread>       // thread
#include <atomic>       // atomic<int>, memory_order_relaxed


//std::atomic_int cnt = ATOMIC_VAR_INIT(0);
std::atomic<int> cnt(0);                        // 同期変数
int cnt2 = 0;                                   // 非同期変数


void f()
{
    for ( int n=0; n<100000; ++n ){
        cnt.fetch_add( 1, std::memory_order_relaxed);
        cnt2++;
    }
}


int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<std::thread>    v;

    for ( int n=0; n<10; ++n){
        v.emplace_back(f);
    }
    for ( auto& t : v ){
        t.join();
    }

    std::cout << "Final counter value (cnt ) is " << cnt << std::endl;
    std::cout << "Final counter value (cnt2) is " << cnt2 << std::endl;

    return EXIT_SUCCESS;
}

 

実行結果:



単純なグローバル変数である cnt2 はコリジョンが発生して 1,000,000 になれません。

atomic, fetch_add でカウントアップした cnt は 1,000,000 になっていることを確認できます。

 

 

参考

 


 

変更履歴

2022-12-14 - ページデザイン更新
2013-07-15 - 新規作成

 

Programming Items トップページ

プライバシーポリシー