我在C#应用程序中使用线程。我有以下情况:
线程A使用以下代码调用线程B:
ThreadStart t = () => StreamManager.ManageStream.mixThread(ref streamClosed, ref opEnded);
Thread threadB = new Thread(t);
threadB.Start();
线程B重复执行此操作:
while (!streamClosed)
{
System.Threading.Thread.Sleep(3000);
//some stuff here
}
opEnded = true;
布尔streamClosed
和opEnded
通过引用从线程A传递到线程B(使用ref
关键字)
线程A,在启动线程B后,执行以下操作:
streamClosed = true;
while(!opEnded)
{
System.Threading.Thread.Sleep(1000); //wait
}
并且线程B停止其工作。但在某些情况下,似乎陷入僵局,因为我从Windows中的活动管理器中删除它,所以仍然被阻止。
有什么问题?
答案 0 :(得分:5)
将opEnded
定义为volatile
。
可能正在缓存(由编译器/优化器)。
但对于在更深层次上错误的代码,这是一个快速且最小化的修复。
真实代码不应该Sleep()
。有更好的方法可以让线程彼此同步。使用哪一个很大程度上取决于你真正想做的事情。你不应该actually use volatile
。