C++ 原子操作内存模型
C++ 原子操作内存模型解决并发编程的什么问题?
相信在大多数应用程序员眼里,代码在编辑器里敲成什么顺序,CPU就按什么顺序执行。但是事实不是这个样子的。
CPU And 编译器会对最终的指令顺序做调整,在单线程纵向观察,你写出的1->2->3->4->5很有可能在最终结果不变(单线程环境)的基础上被优化成各种样子:e.g.:2->1->4->5->3。
但是,把上述的规则拿到多线程环境,就会出事了。
按理说,4执行完的时候,3应该执行完了,但是在优化的作用下4执行完了3可能还没动呢,那么另外一个线程以4影响的变量做条件,然后去读3影响的变量,就会出问题。
也就是,单线程里由于编译优化,乱序执行带来的指令不按序执行,放在多线程环境里的问题。
C++ 原子操作内存模型是什么
从上面的问题出发,引起这个问题的是CPU和编译器。解决的最简单方法就是告诉CPU:WYSIWYG,我怎么顺序写的,你怎么顺序执行,但是这样十分影响性能。有没有稍微松动一些的规约呢?
于是,“规约”成了这个问题的核心点,C++原子类型内存模型就是我们要的“规约”,它告诉程序员,编译器,CPU:只要你遵守这个条件,其余都随你优化。
有哪几种内存模型?
- memory_order_relaxed 不对执行顺序做任何保证
- memory_order_consume 本线程所有后续有关本操作的必须在本操作完成后执行
- memory_order_acquire 本线程所有后续的读操作必须在本条操作完成才能执行
- memory_order_release 本线程所有之前的写操作完成后才执行本操作
- memory_order_acq_rel 同时包含acquire和release
- memory_order_seq_cst 全部顺序执行
参考这里提供的解释,说的比较明白
网友评论