首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

这几句代码是错的? 小弟我人生观扭曲了.

2013-02-24 
这几句代码是错的? 我人生观扭曲了....int a0thread1:Lock()++aUnLock()thread2:Lock()++aUnLock()

这几句代码是错的? 我人生观扭曲了....
int a=0;

thread1:
Lock();
++a;
UnLock();

thread2:
Lock();
++a;
UnLock();

问题很严重啊.. 我觉得我已经写了很多这种代码了
如果不把a申明为volatile,这段代码其实是错了对不对?
[解决办法]

引用
如果不把a申明为volatile,这段代码其实是错了对不对?

冷静一点,volatile对multithread几乎没有任何帮助
如果你真的加入了一堆volatile,你反而得回头将那些valatile移除

Volatile: Almost Useless for Multi-Threaded Programming
http://software.intel.com/en-us/blogs/2007/11/30/volatile-almost-useless-for-multi-threaded-programming/
[解决办法]
我的人生观也差不多了。。 到底对还是错
[解决办法]
主要楼主是goto语句,如果是switch case语句,a因该不会被编译器的优化掉,从代码中可以看出是有被优化掉的危险
哎,我所在的公司都不用release版本,全是未优化过的版本,这样挂掉了好拿core调试,要到能考虑这么细的公司工作还要多长时间啊
[解决办法]
引用:
int a=0;

thread1:
Lock();
++a;
UnLock();

thread2:
Lock();
++a;
UnLock();

问题很严重啊.. 我觉得我已经写了很多这种代码了
如果不把a申明为volatile,这段代码其实是错了对不对?


注定不会错.
[解决办法]
没关系的,volatile 基本上是为硬件操作准备的。
[解决办法]
实际上,对于多核cpu,可以说所有代码都是错的,只是有一些在大多数场合都还可以工作。
这代码,不加volatile,是100%错的话,加了volatile,错99%。
[解决办法]
加了锁,为什么还错?
[解决办法]
引用:
引用:加了锁,为什么还错?
因为锁只能保证同一时间只有一个++a在执行,它不能应付下面这种情况:
线程1:得到锁,把a读到寄存器,++a,释放锁
线程2:得到锁,++a,释放锁,把值从寄存器写回内存
线程1再把值从寄存器写回内存

我的人生观也扭曲了........难道不是因为++a不是原子操作才出现的问题吗,我一直认为加锁就没有问题的
-__-b。有没有高人说明一下啊。
[解决办法]
跟volatile没有关系,你的a定义的是全局变量么,会不会是你a定义的地方无法访问引起编译器报错的
[解决办法]
volatile是定义全局的函数或是变量,对于多线程来说如果你有很多地方要用到该变量或是函数时就定义为volatile型的,你上面写的代码按编程语言的角度来将没问题
[解决办法]
volatile防止编译器乱搞
可用读写栅栏(_ReadWriteBlock之类)代替,效率会高些
PS:volatile跟atomic半毛钱关系没有
[解决办法]
引用:
volatile防止编译器乱搞
可用读写栅栏(_ReadWriteBlock之类)代替,效率会高些
PS:volatile跟atomic半毛钱关系没有

飞哥, 是_WriteBarrier 和 _ReadBarrier 吗? 
没从msdn中查到关于_ReadWriteBlock 的内容.

[解决办法]


int i=1;
++i;
printf( "%d", i );


同样也不能保证输出2,因为“寄存器中的2可能还没有被写回内存”。

热点排行