2014-02-26 139 views
2

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

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

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

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

有什么不对?

+0

你能显示调用代码吗? –

+0

是的,我编辑了我的问题 – GVillani82

+0

您是否尝试实施协作式取消?有更简单的方法来实现这一点。 – Gusdor

回答

5

define opEnded as volatile

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


但是,这是一个快速和最小的修复程序代码是错误的,在更深的层次。

实际代码不应该是Sleep()。有更好的方法让线程彼此同步。使用哪一个取决于你实际想要做什么。你不应该actually use volatile

+1

谢谢,但为什么使用volatile应该可以帮助我? – GVillani82

+0

它可以防止缓存。 –

+0

好吧,但为什么在某些情况下应用程序可以正常工作?只有某些机制破坏了? 但是我声明它是静态的。在这种情况下,我可以声明它是不稳定的吗? – GVillani82