2010-03-25 51 views
0

可能重複:
Can a C# thread really cache a value and ignore changes to that value on other threads?使用橫紗布爾中止線程

比方說我們有這樣的代碼:

bool KeepGoing = true; 
DataInThread = new Thread(new ThreadStart(DataInThreadMethod)); 
DataInThread.Start(); 
//bla bla time goes on 
KeepGoing = false; 

private void DataInThreadMethod() 
{ 
     while (KeepGoing) 
     { 
     //Do stuff 
     } 
    } 
} 

現在的想法是,使用布爾是一種終止線程的安全方法,但是因爲調用線程上存在該布爾值會導致任何問題?

那布爾僅用於調用線程停止線程所以它不喜歡它的其他地方正在使用

回答

2

您需要澄清究竟什麼/在哪裏KeepGoing是,卻沒有;這是不安全的。它可以保存在x86的寄存器中(但在大多數非平凡的例子中這不太可能)。您需要將其設置爲volatile或同步(lock等)訪問它。例如,see here

+0

KeepGoing只是程序中的成員/字段。 – Jon 2010-03-25 09:32:09

+0

使用volatile的x64系統有問題嗎?我讀過這個「使用x64架構,這不是最優化的」。那是什麼意思? – Jon 2010-03-25 09:37:31

+0

@Jon - 很難回答這種情況,但我認爲*這意味着它可能不會被緩存在寄存器中。但國際海事組織,你應該去代碼,總是*工作。 – 2010-03-25 11:55:52

0

但願我不是這個答案切線會關閉,但:

喬恩的Worker class例如具有替代你在做什麼,這是線程安全的。我在while(boolVariable)方法中發現的兩個問題是某些任務比其他任務需要更長的時間(假設您正在執行多個任務),這意味着停止在該任務結束之前不會被捕獲。另一種是當你到達循環結束時會發生什麼?也許是休息一下,或者只是永遠重複那個任務,如果你正在下載一個文件列表,例如這並不總是你想要的。