gpt4 book ai didi

c# - 如何以线程安全的方式检查一个线程的状态?

转载 作者:行者123 更新时间:2023-11-30 15:25:19 24 4
gpt4 key购买 nike

背景:

在调试应用程序时我遇到了这个函数

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。

我的问题:

我怎样才能以线程安全的方式从另一个线程检查一个线程的状态?

我的想法和我研究的内容:

  1. 如果我可以使语句成为原子语句,它就会起作用。我用 Google 搜索了一些东西,例如“如何在 C# 中使语句成为原子”,并得到了很多涉及锁的结果——这不是我想要的,因为据我所知,锁不会使代码成为原子。

  2. 如果我可以将线程 t 从执行该方法的线程中挂起,那么我就可以安全地检查它的状态。我在这里找到的是过时的函数 Suspend 和 Resume。 Microsoft 强烈建议不要使用这些。

  3. 以某种方式更改线程 t 以实现同步。不是一个选择。该代码是可重用代码,已被不同客户端以不同方式重用,Thread t 是客户端代码。不可能更改所有客户端。

我不是多线程大师,所以如果我的任何假设不正确或者我对多线程的理解不正确,请随时指出。

最佳答案

我很确定状态为 RunningWaitSleepJoin 的线程不可能不活动。所以你可以只获取状态(这是一个原子操作),然后检查这两个值:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com