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 了。


留言

熱門文章