c++11的atomic

一。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()

实现多个线程间的同步操作;当条件不满足时,相关线程被一直阻塞,直到某种条件出现,这些线程才会被唤醒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值