C++ Atomic::exchange() 函数



C++ 的std::atomic::exchange() 函数用于自动将原子对象的值替换为新值并返回旧值。此函数在多线程上下文中至关重要,在这些上下文中,您需要确保对变量的读写修改操作以原子方式执行,从而防止数据竞争。

语法

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

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

参数

  • val - 指示要复制到包含对象的值。
  • sync - 指示操作的同步模式。

返回值

它返回调用之前原子变量的值。

异常

此成员函数从不抛出异常。

示例

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

#include <iostream>
#include <atomic>
int main()
{
    std::atomic<int> a(10);
    int x = a.exchange(20);
    std::cout << "Old value: " << x << std::endl;
    std::cout << "New value: " << a.load() << std::endl;
    return 0;
}

输出

以上代码的输出如下:

Old value: 10
New value: 20

示例

考虑以下示例,我们将使用指针执行原子交换。

#include <iostream>
#include <atomic>
int main()
{
    char a = 'A', b = 'B';
    std::atomic<char*> x(&a);
    char* y = x.exchange(&b);
    std::cout << "Old pointer value: " << *y << std::endl;
    std::cout << "New pointer value: " << *x << std::endl;
    return 0;
}

输出

以下是以上代码的输出:

Old pointer value: A
New pointer value: B

示例

在以下示例中,我们将在多线程上下文中执行原子交换。

#include <iostream>
#include <atomic>
#include <thread>
std::atomic<int> x(11);
void a()
{
    int y = x.exchange(22);
    std::cout << "Old value: " << y << std::endl;
}
int main()
{
    std::thread t(a);
    t.join();
    std::cout << "New value: " << x << std::endl;
    return 0;
}

输出

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

Old value: 11
New value: 22
atomic.htm
广告