C++ Atomic::fetch_xor() 函式



C++ 的std::atomic::fetch_xor() 函式是一個原子操作,用於在原子變數和指定值之間執行原子按位異或運算。此函式確保原子變數的執行緒安全操作,防止資料競爭。

此函式有兩種變體:一種具有指定的記憶體順序,控制記憶體操作如何同步,另一種是預設記憶體順序。

語法

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

T fetch_xor (T val, memory_order sync = memory_order_seq_cst) volatile noexcept;
T fetch_xor (T val, memory_order sync = memory_order_seq_cst) noexcept;

引數

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

返回值

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

異常

此函式從不丟擲異常。

示例

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

#include <iostream>
#include <atomic>
int main()
{
    std::atomic<int> x(0b1111);
    int result = x.fetch_xor(0b1010);
    std::cout << "Initial Value:  " << result << std::endl;
    std::cout << "Final Value : " << x.load() << std::endl;
    return 0;
}

輸出

以上程式碼的輸出如下:

Initial Value:  15
Final Value : 5

示例

考慮以下示例,我們將使用迴圈來翻轉原子變數的特定位。在每次迭代中都會呼叫 fetch_xor() 函式。

#include <iostream>
#include <atomic>
int main()
{
    std::atomic<int> x(0);
    for (int i = 0; i < 4; ++i) {
        int a = x.fetch_xor(1 << i);
        std::cout << "Result after " <<  i <<  " iteration : " << a << std::endl;
    }
    std::cout << "Final value : " << x.load() << std::endl;
    return 0;
}

輸出

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

Result after 0 iteration : 0
Result after 1 iteration : 1
Result after 2 iteration : 3
Result after 3 iteration : 7
Final value : 15

示例

讓我們看看以下示例,我們將線上程環境中使用 fetch_xor()。

#include <iostream>
#include <atomic>
#include <thread>
#include <vector>
std::atomic<int> x(0b10101);
void a(int b)
{
    x.fetch_xor(b);
}
int main()
{
    std::vector<std::thread> x1;
    for (int i = 0; i < 4; ++i) {
        x1.emplace_back(a, 1 << i);
    }
    for (auto& t : x1) {
        t.join();
    }
    std::cout << "Result : " << x.load() << std::endl;
    return 0;
}

輸出

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

Result : 26
atomic.htm
廣告