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

处理C#(死锁)中的线程,c#,.net,multithreading,thread-safety,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.T

我在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中通过活动管理器将其杀死


怎么了

opened
定义为
volatile

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


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


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

你能显示呼叫代码吗?是的,我已经编辑了我的问题。你想实施合作取消吗?有更简单的方法来实现这一点。真正的线程也会传递一个队列ConcurrentQueue谢谢,但是为什么使用volatile会对我有所帮助?它会阻止缓存。嗯,好吧,但是为什么在某些情况下应用程序工作得很好?只有在某些时候,这种机制才会失效?但是我声明它是静态的。在这种情况下,我可以将其声明为易失性吗?我不知道“某些情况”的详细信息,但在某些情况下,锁或其他操作可能会导致内存隔离。这取决于
//这里的一些东西
我会使用
而不是
易失性
。请参阅Eric Lippert关于该主题的博客: