我有一個後臺線程在狀態變量done
上循環。當我想停止線程時,我將變量done
設置爲true
。但顯然這個變量從未設置。我知道編譯器可能會優化它,所以我標記爲done
volatile
。但這似乎沒有任何影響。請注意,我並不擔心競賽狀況,所以我還沒有製作它atomic
或使用任何同步結構。我如何讓線程在每次迭代時都不跳過測試變量?還是完全是其他問題? done
最初是false
。揮發性變量被優化了嗎?
struct SomeObject
{
volatile bool done_;
void DoRun();
};
static void RunLoop(void* arg)
{
if (!arg)
return;
SomeObject* thiz = static_cast<SomeObject*>(arg);
while(!(thiz->done_)) {
thiz->DoRun();
}
return;
}
請不要在多線程上下文中使用volatile:http://stackoverflow.com/questions/4557979/when-to-use-volatile-with-multi-threading – Ryp
'我不擔心競爭條件' - 也許你應該。誰將done變量設置爲true? – ComicSansMS
@Ryp所以,基本上'volatile'是無用的。那麼,我該如何完成我想要做的事? – 341008