它更好,但不是太多。
只要result->Status
不是volatile
,編譯器允許減少
while(result->Status == Result::InProgress);
到
if(result->Status == Result::InProgress) for(;;) ;
作爲條件不循環內改變。
調用外部(並且因此隱含地volatile
)函數Sleep
改變這一點,因爲這可能會修改result
結構,除非編譯器知道,Sleep
從未修改數據。因此,根據編譯器的不同,第二種實現不太可能進入無限循環。
也不保證對result->Status
的訪問是原子性的。對於特定的內存佈局和處理器體系結構,讀寫此變量可能由多個步驟組成,這意味着調度程序可能決定介入中間。
由於此刻你所溝通的只是一個簡單的yes/no,而接收線程也應該等待一個否定的回覆,最好的方法是使用你的OS提供的適當的線程同步原語來實現這種效果。這有一個好處,就是當條件改變時你的線程立即被喚醒,並且它在此期間不使用CPU,因爲操作系統知道你的線程正在等待什麼。
在Windows上,使用CreateEvent
和co。使用事件對象進行通信;在Unix上,使用一個pthread_cond_t
對象。