C++内存序、屏障和原子操作

一、原子类型

标准原子类型的备选名和与其相关的 std::atomic<> 特化类:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4psW5uEr-1686037483287)(https://secure2.wostatic.cn/static/xVXzcu3t5AZGRiwnxGh6F/image.png?auth_key=1686030347-G9cWtJFXKED1hSzUhBPDv-0-9f02a56fd44b031470f4ae1148e593de)]
除上述类型外还有std::atomic<T*>类型,返回的也是T*类型,操作接口语义也是一样的。

同时原子类型也可能是自定义类型,如果是其它自定义类型,则需要满足下面一些条件:

  • 这个类型必须有拷贝赋值运算符;
  • 这个类型不能有任何虚函数或虚基类,以及必须使用编译器创建的拷贝赋值操作;
  • 自定义类型中所有的基类和非静态数据成员也都需要支持拷贝赋值操作,即可使用memcpy()进行拷贝;
  • 这个类型必须是“位可比的”(bitwise equality comparable),可以调用memcmp()对位进行比较;

但是建议自定义类型不要太过复杂,因为这样反而会降低程序性能。

以下是对应每种类型必须提供的成员接口函数:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7qEP8vUf-1686037483288)(https://secure2.wostatic.cn/static/3vcoGXyWjrHZYAh5VZ2mU8/image.png?auth_key=1686033366-4tJ8qKeqniAycC2dmVWTCB-0-06448f2a50d9d43542b55182616ab15d)]

二、原子操作函数

原子操作类常用成员函数有fetch_*、store、load、exchange、compare_exchange_weak和compare_exchange_strong:

  • fetch_*:先获取值再计算,即返回的是修改之前的值;
  • store:写入数据;
  • load:加载并返回数据;
  • exchange:直接设置一个新值;
  • compare_exchange_weak:先比较第一个参数的值和要修改的内存值(第二个参数)是否相等,如果相等才会修改,该函数有可能在except == value时也会返回false所以一般用在while中,直到为true才退出;
  • compare_exchange_strong:功能和*_weak一样,不过except == value时该函数保证不会返回false,但该函数性能不如*_weak;

注意:使用操作符(如+=、++、^=等)时要看类成员是否提供对应操作符,否则可能出现意想不到的问题。

三、内存序

1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值