int a=0;
thread1:
Lock();
++a;
UnLock();
thread2:
Lock();
++a;
UnLock();
锁只能保证同一时间只有一个++a在执行,它不能应付下面这种情况:
线程1:得到锁,把a读到寄存器,++a,释放锁
线程2:得到锁,++a,释放锁,把值从寄存器写回内存
线程1再把值从寄存器写回内存
落后的编译器的“过度优化”造成的可能的问题,一般的release选项是不会造成这种问题的,而且造成这种问题不是代码的错,而是编译器的错。我记得以前看过的书也写过double lock check也一样有可能被优化出错,但是这种情况我们是没有什么办法的。
请看下面的程序:
1 2 3 4 5 6 7 | int * ptr = getPointer(); cout << *ptr << endl; //我们假设这个输出为0,也就是*ptr的运算结果为0 //这个时候,某一线程将*ptr加1 cout << *ptr << endl; //这是第二次输出,但结果可能是1也可能是0 |
volatile防止编译器乱搞
可用读写栅栏(_WriteBarrier 和 _ReadBarrier之类)代替,效率会高些
联系客服