你必須記住線程也可以尋找過時副本,通過鎖定你保證你是在尋找變量的版本被刷新
當我第一次開始編碼並認爲可能不需要最新的變量副本時,我會陷入無限循環,因爲我認爲變量最終會被更新,但是如果變量被緩存了,那麼它將永遠不會更新
我包含了一些簡單描述的例子,不用擔心線程的啓動方式d,當你開始循環有一個機會,你會繼續得到變量的過時副本不相關
private static bool _continueLoop = true;
private static readonly object _continueLoopLock = new object();
private static void StopLoop()
{
lock(_continueLoopLock)
_continueLoop = false;
}
private static void ThreadALoopWillGetStales()
{
while(_continueLoop)
{
//do stuff
//this is not guaranteed to end
}
}
private static void ThreadALoopEventuallyCorrect()
{
while(true)
{
bool doContinue;
lock(_continueLoopLock)
doContinue = _continueLoop;
if(!doContinue)
break;
//do stuff
//this will sometimes result in a stale value
//but will eventually be correct
}
}
private static void ThreadALoopAlwaysCorrect()
{
while(true)
{
bool doContinue;
lock(_continueLoopLock)
if(!_continueLoop)
break;
//do stuff
//this will always be correct
}
}
private static void ThreadALoopPossibleDeadlocked()
{
lock(_continueLoopLock)
while(_continueLoop)
{
//if you only modify "_continueLoop"
//after Acquiring "_continueLoopLock"
//this will cause a deadlock
}
}
private static void StartThreadALoop()
{
ThreadPool.QueueUserWorkItem ((o)=>{ThreadALoopWillGetStales();});
}
private static void StartEndTheLoop()
{
ThreadPool.QueueUserWorkItem((o)=>
{
//do stuff
StopLoop();
});
}
public static void Main(string[] args)
{
StartThreadALoop();
StartEndTheLoop();
}
,這就是爲什麼你做訪問時需要某種形式的同步跨越多個線程
你是什麼意思的「錯誤」? – user7116
'+ ='是一個* read *和* assignment *(非原子一起)。 – Paul
對不起 - 我的意思是閱讀和分配。是的,這正是我想用+ = – JoeS