《C++ Concurrency in Action》笔记24 std::atomic、std::atomic

5.2.4 std::atomic相关操作

某种类型指针的原子类型就是std::atomic,就像bool类型的原子类型是std::atomic一样。接口从本质上来说是一样的。它不支持拷贝构造和拷贝赋值,尽管他可以从对应的非原子类型的指针构造以及赋值。它也有load(),store() ,exchange(),compare_exchange_weak(),以及compare_exchange_strong()。

std::atomic增加了指针相关的操作。基本的操作是 fetch_add()和 fetch_sub(),分别代表地址相加和地址相减。还有+=、-=,还有前置及后置++、--。

这些重载的运算符就像你期待的那样,与內建类型一样:如果 x是std::atomic类型的对象,并且它指向一个Foo数组,那么x+=3代表把它向后移动3个位置,返回的是一个原始的Foo*,指向相对于之前位置的第4个元素,并不返回std::atomic对象的引用。但是 fetch_add()和fetch_sub()返回的却是执行函数前的原始指针。这些操作是一种read-modify-write类型的操作。

除了返回值不同以外,fetch_add()以及fetch_sub()这些命名函数与重载运算符函数的另一个不同之处在于,命名函数可以指定内存指令参数:

p.fetch_add(3,std::memory_order_release);

而重载运算符无法指定多余参数,它们的内存指令总是memory_order_seq_cst。

5.2.5 std::atomic<整型>

标准整型原子类型本质上都一样,拥有相同的一套操作。它们除了拥有load() ,  store() ,  exchange() ,  compare_exchange_weak() , compare_exchange_strong()这些函数外,它们还有一系列有用的函数:fetch_add() ,  fetch_sub() ,  fetch_and() ,  fetch_or() ,fetch_xor(),以及相应的重载函数 += ,  -= ,  ++x,x++,--x,x--,&= ,  |= , ^=。这些操作几乎涵盖了所有整型的操作需要,除了除法、乘法、位移动这3个操作。因为整型原子类型几乎被用来作为计数器或者位掩码,所以也称不上是什么缺失。如果需要的话,可以循环使用compare_exchange_weak()函数去实现这3个操作。



你可能感兴趣的:(C++11,STL,多线程)