- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景:
在调试应用程序时我遇到了这个函数
boolean IsThreadGood(Thread t)
{
return t.IsAlive && t.ThreadState == ThreadState.Running || t.ThreadState == ThreadState.WaitSleepJoin;
}
我认为这是一个错误,因为 return 语句中发生的逻辑比较不是原子的,因此我认为线程 t 可以在执行表达式时更改状态。为了验证这个想法,我将代码更改为以下代码,以便我可以放置断点:
bool IsThreadGood(Thread t)
{
if (t.IsAlive)
{
if (t.ThreadState == ThreadState.Running)
{
return true;
}
if (t.ThreadState == ThreadState.WaitSleepJoin)
{
return true;
}
}
return false;
}
我在内部 if 语句上放置了断点,很快就看到了我怀疑的内容。当代码到达第一个断点时,Thread t 的 ThreadState 为 WaitSleepJoin,当我跨过代码到下一个 if 语句时,Thread t 已切换状态并且 ThreadState 为 Running,因此两个测试均失败并从方法返回 false应该返回 true。
我的问题:
我怎样才能以线程安全的方式从另一个线程检查一个线程的状态?
我的想法和我研究的内容:
如果我可以使语句成为原子语句,它就会起作用。我用 Google 搜索了一些东西,例如“如何在 C# 中使语句成为原子”,并得到了很多涉及锁的结果——这不是我想要的,因为据我所知,锁不会使代码成为原子。
如果我可以将线程 t 从执行该方法的线程中挂起,那么我就可以安全地检查它的状态。我在这里找到的是过时的函数 Suspend 和 Resume。 Microsoft 强烈建议不要使用这些。
以某种方式更改线程 t 以实现同步。不是一个选择。该代码是可重用代码,已被不同客户端以不同方式重用,Thread t 是客户端代码。不可能更改所有客户端。
我不是多线程大师,所以如果我的任何假设不正确或者我对多线程的理解不正确,请随时指出。
最佳答案
我很确定状态为 Running
或 WaitSleepJoin
的线程不可能不活动。所以你可以只获取状态(这是一个原子操作),然后检查这两个值:
boolean IsThreadGood(Thread t)
{
ThreadState state = t.ThreadState;
return state == ThreadState.Running || state == ThreadState.WaitSleepJoin;
}
请注意 the documentation明确指出您应该只将线程状态用于调试目的,而不是用于同步:
Thread state is only of interest in debugging scenarios. Your code should never use thread state to synchronize the activities of threads.
由于您对原子操作感兴趣,我怀疑您是否希望将其用于调试目的(否则您无需关心它的超精确性)。因此,您可能应该考虑以不同的方式解决您的实际问题。
关于c# - 如何以线程安全的方式检查一个线程的状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31442391/
我是一名优秀的程序员,十分优秀!