Вы должны помнить, нить также может быть глядя на несвежей копии, блокируя вас заверить, что версия переменной, которую вы смотрите на это обновляется
Когда я впервые начал кодирование и подумал, что, возможно, мне не нужна самая свежая копия переменной, которую я бы застрял в бесконечных циклах, потому что я предполагаю, что переменная будет в конечном итоге обновлена, но если переменная была кэширована, она никогда не обновлялась
Я включил примеры с краткими описаниями, не волнуйтесь о том, как поток запускается 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 * и * присваиванием * (неатомно вместе). – Paul
Извините - я имел в виду читать и назначать. Да, это то, что я пытался продемонстрировать с помощью + = – JoeS