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 | - | 新規作成 |