名前空間
変種
操作

std::atomic_ref<T>::atomic_ref

From cppreference.com
< cpp‎ | atomic‎ | atomic ref
 
 
並行性サポートライブラリ
スレッド
(C++11)
(C++20)
this_thread 名前空間
(C++11)
(C++11)
(C++11)
協調的なキャンセル
排他制御
(C++11)
汎用ロック管理
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
条件変数
(C++11)
セマフォ
ラッチとバリア
(C++20)
(C++20)
future
(C++11)
(C++11)
(C++11)
(C++11)
安全なメモリ解放 (Safe Reclamation)
(C++26)
ハザードポインタ
アトミック型
(C++11)
(C++20)
アトミック型の初期化
(C++11)(C++20で非推奨)
(C++11)(C++20で非推奨)
メモリオーダー
(C++11)(C++26で非推奨)
アトミック操作のためのフリー関数
アトミックフラグのためのフリー関数
 
 
explicit atomic_ref( T& obj );
(1) (C++26 以降 constexpr)
atomic_ref( const atomic_ref& ref ) noexcept;
(2) (C++26 以降 constexpr)

新しいatomic_refオブジェクトを構築します。

1) オブジェクトobjを参照するatomic_refオブジェクトを構築します。
objrequired_alignmentにアライメントされていない場合、動作は未定義です。
2) refによって参照されているオブジェクトを参照するatomic_refオブジェクトを構築します。

[編集] パラメータ

obj - 参照するオブジェクト
ref - コピー元の別のatomic_refオブジェクト

[編集]

このプログラムは、複数のスレッドを使用してコンテナ内の値をインクリメントします。その後、最終的な合計が出力されます。非アトミックアクセスは、データ競合のために一部の操作の結果を「失う」可能性があります。

#include <atomic>
#include <iostream>
#include <numeric>
#include <thread>
#include <vector>
 
int main()
{
    using Data = std::vector<char>;
 
    auto inc_atomically = [](Data& data)
    {
        for (Data::value_type& x : data)
        {
            auto xx = std::atomic_ref<Data::value_type>(x);
            ++xx; // atomic read-modify-write
        }
    };
 
    auto inc_directly = [](Data& data)
    {
        for (Data::value_type& x : data)
            ++x;
    };
 
    auto test_run = [](const auto Fun)
    {
        Data data(10'000'000);
        {
            std::jthread j1{Fun, std::ref(data)};
            std::jthread j2{Fun, std::ref(data)};
            std::jthread j3{Fun, std::ref(data)};
            std::jthread j4{Fun, std::ref(data)};
        }
        std::cout << "sum = " << std::accumulate(cbegin(data), cend(data), 0) << '\n';
    };
 
    test_run(inc_atomically);
    test_run(inc_directly);
}

実行結果の例

sum = 40000000
sum = 39994973
English 日本語 中文(简体) 中文(繁體)