作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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;
bool 值 streamClosed
和 opEnded
通过引用(使用 ref
关键字)从线程 A 传递到线程 B
线程A,启动线程B后,执行以下操作:
streamClosed = true;
while(!opEnded)
{
System.Threading.Thread.Sleep(1000); //wait
}
线程B停止工作。但在某些情况下,似乎陷入了僵局,自从我从 Windows 中的事件管理器中杀死它以来,它仍然被阻止。
出了什么问题?
最佳答案
将 opEnded
定义为 volatile
。
它可能正在被缓存(由编译器/优化器)。
但这对于更深层次的错误代码来说是一个快速且最小的修复。
真实代码不应该Sleep()
。有很多更好的方法可以使线程彼此同步。使用哪一种很大程度上取决于您实际想要做什么。你不应该actually use volatile
。
关于c# - C# 中线程的处理(死锁),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22039257/
我是一名优秀的程序员,十分优秀!