C++ Atomic::fetch_add() 函式



C++ 的std::atomic::fetch_add()函式用於將指定的值新增到原子物件,並返回物件在新增之前儲存的值。此函式可以防止競爭條件,確保多個執行緒可以安全地更新共享變數,而不會導致資料損壞。

語法

以下是 std::atomic::fetch_add() 函式的語法。

T fetch_add (T val, memory_order sync = memory_order_seq_cst) volatile noexcept;
T fetch_add (T val, memory_order sync = memory_order_seq_cst) noexcept;
or
T fetch_add (ptrdiff_t val, memory_order sync = memory_order_seq_cst) volatile noexcept;
T fetch_add (ptrdiff_t val, memory_order sync = memory_order_seq_cst) noexcept;

引數

  • val - 表示要新增的值。
  • sync - 表示操作的同步模式。

返回值

此函式返回呼叫前的包含值。

異常

此成員函式從不丟擲異常。

示例

在以下示例中,我們將考慮 fetch_add() 函式的基本用法。

#include <iostream>
#include <atomic>
int main()
{
    std::atomic<int> x(11);
    int y = x.fetch_add(2);
    std::cout << "Old value: " << y << std::endl;
    std::cout << "New value: " << x << std::endl;
    return 0;
}

輸出

以上程式碼的輸出如下:

Old value: 11
New value: 13

示例

考慮以下示例,我們將在此示例中在迴圈中使用 fetch_add() 函式。

#include <iostream>
#include <atomic>
#include <thread>
#include <vector>
int main()
{
    std::atomic<int> a(1);
    std::vector<std::thread> b;
    for (int x = 0; x < 3; ++x) {
        b.emplace_back([&a]() {
            for (int y = 0; y < 10; ++y) {
                a.fetch_add(1);
            }
        });
    }
    for (auto& thread : b) {
        thread.join();
    }
    std::cout << "Result : " << a << std::endl;
    return 0;
}

輸出

以下是以上程式碼的輸出:

Result : 31

示例

讓我們來看以下示例,我們將在此示例中新增負值。

#include <iostream>
#include <atomic>
int main()
{
    std::atomic<int> x(12);
    int a = x.fetch_add(-6);
    std::cout << "Result after fetch_add: " << a << std::endl;
    std::cout << "Atomic variable after fetch_add: " << x << std::endl;
    return 0;
}

輸出

如果我們執行以上程式碼,它將生成以下輸出:

Result after fetch_add: 12
Atomic variable after fetch_add: 6
atomic.htm
廣告