处理C#(死锁)中的线程
我在C#应用程序中使用线程。我有以下情况: 线程A调用线程B,使用以下代码:处理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
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关于该主题的博客: