C++ Atomic::fetch_and() 函数



C++ 的std::atomic::fetch_and()函数用于对原子对象的数值执行原子按位与操作。它通过使用给定参数进行按位与修改原子变量,确保线程安全,无需使用锁。它返回操作前的原始值。

语法

以下是 std::atomic::fetch_and() 函数的语法。

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

参数

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

返回值

此函数返回调用前的包含值。

异常

此函数从不抛出异常。

示例

在以下示例中,我们将考虑 fetch_and() 函数的基本用法。

#include <iostream>
#include <atomic>
int main()
{
    std::atomic<int> x(0b1100);
    int y = x.fetch_and(0b1010);
    std::cout << "Original value: " << y << std::endl;
    std::cout << "New value: " << x.load() << std::endl;
    return 0;
}

输出

上述代码的输出如下所示:

Original value: 12
New value: 8

示例

考虑以下示例,我们将使用多个 fetch_and() 并观察输出。

#include <iostream>
#include <atomic>
int main()
{
    std::atomic<int> x(0b00110);
    int a = x.fetch_and(0b10011);
    int b = x.fetch_and(0b10000);
    std::cout << "Result after first fetch_and: " << a << std::endl;
    std::cout << "Result after second fetch_and: " << b << std::endl;
    std::cout << "Final value: " << x.load() << std::endl;
    return 0;
}

输出

如果我们运行上述代码,它将生成以下输出:

Result after first fetch_and: 6
Result after second fetch_and: 2
Final value: 0

示例

让我们看以下示例,我们将使用带 std::memory_order_relaxed 的 fetch_and()。

#include <iostream>
#include <atomic>
#include <thread>
std::atomic<int> x(0b0101);
void a()
{
    int b = x.fetch_and(0b0100, std::memory_order_relaxed);
    std::cout << "Old value: " << b << ", New value: " << x.load() << '\n';
}
int main()
{
    std::thread t1(a);
    t1.join();
    return 0;
}

输出

以下是上述代码的输出:

Old value: 5, New value: 4
atomic.htm
广告