C++ Atomic::fetch_sub() 函数



C++ 的std::atomic::fetch_sub()函数用于从原子对象的当前值中减去指定的值,并返回减法之前它保存的值。此函数在多线程环境中很重要,可以防止多个线程同时访问和修改共享变量时发生竞争条件。

语法

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

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

参数

  • val − 指示要减去的数值。
  • sync − 指示操作的同步模式。

返回值

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

异常

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

示例

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

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

输出

以上代码的输出如下:

Old value: 11
New value: 7

示例

考虑以下示例,我们将在此示例中执行多线程场景下的 fetch_sub()。

#include <iostream>
#include <atomic>
#include <thread>
#include <vector>
std::atomic<int> a(49);
void b()
{
    for (int x = 0; x < 9; ++x) {
        a.fetch_sub(1);
    }
}
int main()
{
    std::vector<std::thread> c;
    for (int y = 0; y < 5; ++y) {
        c.emplace_back(b);
    }
    for (auto& t : c) {
        t.join();
    }
    std::cout << "Final value: " << a << std::endl;
    return 0;
}

输出

以下是以上代码的输出:

Final value: 4
atomic.htm
广告