一、原子类型
标准原子类型的备选名和与其相关的 std::atomic<> 特化类:
除上述类型外还有std::atomic<T*>
类型,返回的也是T*
类型,操作接口语义也是一样的。
同时原子类型也可能是自定义类型,如果是其它自定义类型,则需要满足下面一些条件:
- 这个类型必须有拷贝赋值运算符;
- 这个类型不能有任何虚函数或虚基类,以及必须使用编译器创建的拷贝赋值操作;
- 自定义类型中所有的基类和非静态数据成员也都需要支持拷贝赋值操作,即可使用memcpy()进行拷贝;
- 这个类型必须是“位可比的”(bitwise equality comparable),可以调用memcmp()对位进行比较;
但是建议自定义类型不要太过复杂,因为这样反而会降低程序性能。
以下是对应每种类型必须提供的成员接口函数:
二、原子操作函数
原子操作类常用成员函数有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;
注意:使用操作符(如+=、++、^=等)时要看类成员是否提供对应操作符,否则可能出现意想不到的问题。