原子操作--atomic


简介

原子操作库
在 C++11 中,std::atomic是一个用于原子操作的类模板。它提供了原子的读-改-写操作,以确保在多线程环境下对共享变量的操作是线程安全的。

std::atomic的主要用途是对共享变量进行原子操作,例如递增、递减、赋值等。它可以用于实现线程安全的数据结构、计数器、信号量等。

下面是一个简单的示例,展示了如何使用std::atomic

#include <iostream>
#include <atomic>
#include <thread>

std::atomic<int> count(0);

void increment()
{
    count++;
}

int main()
{
    std::thread t1(increment);
    std::thread t2(increment);

    t1.join();
    t2.join();

    std::cout << "Count: " << count << std::endl;

    return 0;
}

在上面的示例中,我们创建了一个std::atomic<int>类型的变量count,初始值为 0。然后,我们创建了两个线程t1t2,它们都调用increment函数对count进行递增操作。

由于std::atomic保证了原子性,所以在多线程环境下,count的值将被正确地递增,而不会出现竞态条件或数据不一致的问题。

std::atomic还提供了其他成员函数,例如operator++()operator--()operator=()等,用于进行各种原子操作。


成员函数

std::atomic类提供了一些成员函数,用于执行原子操作。这些函数在 C++11 中可用,用于多线程环境下对共享变量进行操作。

以下是std::atomic类的一些常见成员函数:

  1. operator++():递增原子变量。

  2. operator--():递减原子变量。

  3. operator=():赋值原子变量。

  4. operator==():比较原子变量与另一个值是否相等。

  5. operator!=():比较原子变量与另一个值是否不相等。

  6. fetch_add():原子地将一个值添加到原子变量中。

  7. fetch_sub():原子地从原子变量中减去一个值。

  8. fetch_or():原子地将一个值或操作原子变量的值。

  9. fetch_and():原子地将一个值与操作原子变量的值。

  10. fetch_xor():原子地异或操作原子变量的值。

  11. exchange():原子地交换原子变量的值。

  12. compare_exchange_weak():原子地比较并交换原子变量的值(如果相等)。

  13. compare_exchange_strong():原子地比较并交换原子变量的值(如果相等),具有更强的顺序保证。

这些成员函数提供了原子性的读-改-写操作,确保在多线程环境下对共享变量的操作是线程安全的。它们避免了竞态条件和数据不一致的问题。

示例:
fetch_addfetch_orstd::atomic类的成员函数,用于原子地读取并修改原子变量的值。它们提供了一种线程安全的方式来进行读-改-写操作。

以下是使用fetch_addfetch_or的简单示例:

#include <iostream>
#include <thread>
#include <atomic>

std::atomic<int> atomicVar(0);

void increment() {
    atomicVar.fetch_add(1);
}

void bitwiseOr() {
    atomicVar.fetch_or(1 << 2);
}

int main() {
    std::thread t1(increment);
    std::thread t2(bitwiseOr);

    t1.join();
    t2.join();

    std::cout << "final value of atomicVar: " << atomicVar << std::endl;

    return 0;
}
/*
final value of atomicVar: 5
*/

在上面的示例中,我们创建了一个std::atomic<int>类型的变量atomicVar,初始值为 0。

  • increment函数使用fetch_add函数将原子变量的值增加 1。

  • bitwiseOr函数使用fetch_or函数将原子变量的值按位或操作,将第二个参数的值设置为 1。

我们创建了两个线程,一个调用increment函数,另一个调用bitwiseOr函数。两个线程同时对atomicVar进行操作。

最后,我们打印出atomicVar的最终值。由于fetch_addfetch_or是原子操作,我们可以确保线程安全和正确的操作结果。

posted @   guanyubo  阅读(106)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示