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

时间:2014-02-26 10:58:41

标签: c# .net multithreading thread-safety

我在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通过引用从线程A传递到线程B(使用ref关键字)

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

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

并且线程B停止其工作。但在某些情况下,似乎陷入僵局,因为我从Windows中的活动管理器中删除它,所以仍然被阻止。

有什么问题?

1 个答案:

答案 0 :(得分:5)

opEnded定义为volatile

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


但对于在更深层次上错误的代码,这是一个快速且最小化的修复。

真实代码不应该Sleep()。有更好的方法可以让线程彼此同步。使用哪一个很大程度上取决于你真正想做的事情。你不应该actually use volatile