处理C#中的线程(死锁)



我在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;

布尔值streamClosedopEnded通过引用(使用ref关键字)从线程A传递到线程B

线程A在启动线程B后,执行以下操作:

streamClosed = true;
while(!opEnded)
{
System.Threading.Thread.Sleep(1000); //wait 
}

并且线B停止其工作。但在某些情况下,似乎处于死锁状态,由于我从Windows中的活动管理器中删除了它,因此仍然被阻止。

怎么了?

opEnded定义为volatile

它可能正在被缓存(由编译器/优化器)。


但对于深层次的错误代码,这是一个快速而最小的修复。

真实代码不应该是Sleep()。有更好的方法可以使线程相互同步。使用哪一个在很大程度上取决于你真正想做什么。你实际上不应该使用volatile

最新更新