C++原子操作

C++原子操作

背景

原子操作

并发系统要保证数据的有序性,需要对数据进行有序访问,保持数据的有序访问有两种方式:锁和原子操作。
锁相对于原子操作更容易理解,不容易错误,缺点是锁会造成线程切换,耗时会比较多,在一些极端场景,如
高频交易,线程切换所产生的耗时是不能忍受的.所以,在高频交易场景都会优先考虑原子操作。

原理

原子操作的原理其实非常简单,其本质就是一个自旋锁,不停的做比较并交换的操作,因为它会一直占用CPU
,所以不存在线程切换的耗时。

底层实现

  • 总线锁
  • 缓存锁
  • CAS指令

查阅了一些相关资料,原子底层可能是通过上面三种方式实现,一直没有找到真正权威的文章。

场景

原子操作用于高并发场景,为什么呢?前面我们提到过,保证并发的有序性有两种方法:锁和原子操作。如果
用锁,当并发达到一定量级后,如果一个锁占用了CPU,其它线程让出CPU,进入休眠状态,如果这时候占有
锁的线程释放了锁,操作系统会通知其它线程去占用锁,这个过程因为涉及到操作系统的操作,所以会非常耗
时,并发的线程数多的时候,就会有大量CPU消耗在线程调度上,而原子操作,由于是自旋锁,线程不会让出
CPU资源,所以不存在线程调度,所以响应会非常快,对于金融高频场景非常适合。

CAS(比较并交换)

atomic

C++ Memory model

Memery model

编译器有时候为了优化,并不按我们代码的顺序进行执行,这样在单线程环境下没有任何影响,但是在高并发
的情况下,这就是致命的,所以C++11引入了Memory model,程序员可以自己指定编译器要不要严格按照顺
序执行,如果程序员自己知道不按照顺序执行没有影响,那么可以让编译器自己优化,这样程序的执行的效率
会非常高。C++11规范相当于提供了一个语法让程序员自己决定要不要进行优化。

总结

你可能感兴趣的:(C++原子操作)