- 主题:这样的程序有问题吗
当然有问题。
首先test应该声明为voilate。然后由于指令重排和乱序,test的赋值可能会被提前执行。
如果你想写无锁代码,先理解一下什么是memory fence,以及在C++11中如何实现。
否则老老实实的加锁吧。
【 在 grainbuds 的大作中提到: 】
: bool test = false;
: int v;
:
: ...................
--来自微水木3.5.11
--
修改:foliver FROM 223.167.168.*
FROM 223.167.168.*
和原子性关系不大,重点得保证test的赋值一定是最后执行。
所以得使用fence。
【 在 grainbuds 的大作中提到: 】
: std::atomic<bool> test = false;
: int v;
:
: ...................
--来自微水木3.5.11
--
FROM 223.167.168.*
指令重排有两层含义:
编译器重排和cpu执行时重排。
x86的强内存模型只是保证cpu在执行时不会破坏汇编指令的内存访问顺序,但编译器在生成指令时就可能已经重排过了。
总之,仔细理解c++定义的的六种内存模型,并适当运用,因为内存模型也是有代价的,运用不当的话可能比锁的开销还大。
所以我的建议:用锁搞定数据结构,流程操作数据,比如你的例子就是很差的模型。就当你开始学习多线程随便举了个例子。
【 在 grainbuds 的大作中提到: 】
: 查了一下资料,是否至少在x86/64下没问题,因为具有strong memory model
: 【 在 foliver 的大作中提到: 】
: : 和原子性关系不大,重点得保证test的赋值一定是最后执行。
: ...................
--来自微水木3.5.11
--
FROM 140.206.195.*