名稱空間
變體
操作

std::atomic_ref<T>::atomic_ref

來自 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)
期值
(C++11)
(C++11)
(C++11)
(C++11)
安全回收
(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) 構造一個引用物件 objatomic_ref 物件。
如果 obj 沒有對齊到 required_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