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

GVi*_*i82 2 .net c# multithreading thread-safety

我在C#应用程序中使用线程.我有以下场景:

线程A使用以下代码调用线程B:

ThreadStart t = () => StreamManager.ManageStream.mixThread(ref streamClosed, ref opEnded);
Thread threadB = new Thread(t);
threadB.Start();
Run Code Online (Sandbox Code Playgroud)

线程B重复执行此操作:

while (!streamClosed)
    {
         System.Threading.Thread.Sleep(3000);
         //some stuff here
    }
opEnded = true;
Run Code Online (Sandbox Code Playgroud)

boolean streamClosedopEnded通过引用从线程A传递给线程B(使用ref关键字)

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

streamClosed = true;
while(!opEnded)
{
    System.Threading.Thread.Sleep(1000); //wait 
}
Run Code Online (Sandbox Code Playgroud)

并且线程B停止其工作.但在某些情况下,似乎陷入僵局,因为我从Windows中的Activity Manager中杀了它,所以仍然被阻止.

怎么了?

Hen*_*man 5

定义opEndedvolatile.

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


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

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