我在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
通过引用(使用ref
关键字)从线程A传递到线程B
线程A在启动线程B后,执行以下操作:
streamClosed = true;
while(!opEnded)
{
System.Threading.Thread.Sleep(1000); //wait
}
并且线B停止其工作。但在某些情况下,似乎处于死锁状态,由于我从Windows中的活动管理器中删除了它,因此仍然被阻止。
怎么了?
将opEnded
定义为volatile
。
它可能正在被缓存(由编译器/优化器)。
但对于深层次的错误代码,这是一个快速而最小的修复。
真实代码不应该是Sleep()
。有更好的方法可以使线程相互同步。使用哪一个在很大程度上取决于你真正想做什么。你实际上不应该使用volatile
。