volatile
volatile 關鍵字可以阻止 compiler 做最佳化,將變數放到暫存器中加快速度而不寫回。volatile 也可以阻止 compiler 因為最佳化的關係將兩條不相干的指令做交換。
Ex:
x = 0;
thread1 thread2
lock(); lock();
x++; x++;
unlock(); unlock();
看起來 x 似乎會等於 2。但如果 compiler 最佳化後,它可能將 x 謮入 register 以加快速度。由於不同 thread 的 register 是各自獨立的。因此可能會有如下情況:
1. thread1 將 x 值 0 讀進 R,R++ 但不寫回 x
2. thread2 將 x 值 0 讀進 R,R++
3. thread2 將 R 寫回 x
4. thread1 將 R 寫回 x
這樣子 x 就等於 1,也就是非預期的結果了。另一個例子:
int result = 0;
bool bExit;
void thread()
{
result = 1;
bExit = true;
}
int main()
{
bExit = false;
CreateThread();
while (!bExit)
{
printf("%d\n", result);
Sleep(10);
}
}
假使 compiler 最佳化的結果,將 result = 1 與 bExit = true 交換。那麼在 main 中將 result 印出來結果就等於 0 而不是 1 了。
留言
張貼留言