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 streamClosed并opEnded通过引用从线程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中杀了它,所以仍然被阻止.
怎么了?
定义opEnded为volatile.
它可能正在被缓存(由编译器/优化器).
但对于在更深层次上错误的代码,这是一个快速且最小的修复.
真正的代码不应该Sleep().有更好的方法可以让线程彼此同步.使用哪一个很大程度上取决于你真正想做的事情.你实际上volatile不应该使用.
| 归档时间: |
|
| 查看次数: |
127 次 |
| 最近记录: |