2010-03-25 60 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)方法中发现的两个问题是某些任务比其他任务需要更长的时间(假设您正在执行多个任务),这意味着停止在该任务结束之前不会被捕获。另一种是当你到达循环结束时会发生什么?也许是休息一下,或者只是永远重复那个任务,如果你正在下载一个文件列表,例如这并不总是你想要的。