一。atomic
C++11给我们带来的atomic模板类,它们提供的方法都是具有原子性
这些模板类都禁用了拷贝构造函数
(原因是原子读和原子写是2个独立原子操作,无法保证2个独立的操作加在一起仍然保证原子性)
atomic<T>提供了常见且容易理解的方法:
1.store ---store是原子写操作,而load则是对应的原子读操作。
2.load
3.exchange ---允许2个数值进行交换,并保证整个过程是原子的。
4.compare_exchange_weak
5.compare_exchange_strong
compare_exchange_weak和compare_exchange_strong则是CAS(compare and set)。
参数会要求在这里传入期待的数值和新的数值。
它们对比变量的值和期待的值是否一致,如果是,则替换为用户指定的一个新的数值。
如果不是,则将变量的值和期待的值交换。
原文链接:https://blog.csdn.net/feikudai8460/article/details/107035480/
二。atomic技能扩展记录
3、CAS操作
CAS即Compare and Swap,是所有CPU指令都支持CAS的原子操作(X86中CMPXCHG汇编指令),用于实现实现各种无锁(lock free)数据结构。
CAS操作的C语言实现如下:
bool compare_and_swap ( int *memory_location, int expected_value, int new_value)
{
if (*memory_location == expected_value)
{
*memory_location = new_value;
return true;
}
return false;
}
CAS用于检查一个内存位置是否包含预期值,如果包含,则把新值复赋值到内存位置。成功返回true,失败返回false。
(1)GGC对CAS支持
GCC4.1+版本中支持CAS原子操作。
bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...);
type __sync_val_compare_and_swap (type *ptr, type oldval type newval, ...);
(2)Windows对CAS支持
Windows中使用Windows API支持CAS。
LONG InterlockedCompareExchange(
LONG volatile *Destination,
LONG ExChange,
LONG Comperand
);
(3)C11对CAS支持
C11 STL中atomic函数支持CAS并可以跨平台。
template< class T >
bool atomic_compare_exchange_weak( std::atomic* obj,T* expected, T desired );
template< class T >
bool atomic_compare_exchange_weak( volatile std::atomic* obj,T* expected, T desired );
其它原子操作如下:
Fetch-And-Add:一般用来对变量做+1的原子操作
Test-and-set:写值到某个内存位置并传回其旧值
C++性能优化(十三)——无锁队列
原文链接:https://blog.51cto.com/quantfabric/2588193
三。c++11的条件变量
condition_variable 的wait(), notify_all(), notify_one()
实现多个线程间的同步操作;当条件不满足时,相关线程被一直阻塞,直到某种条件出现,这些线程才会被唤醒