【问题标题】:Can a thread call SuspendThread passing its own thread ID?线程可以通过自己的线程 ID 调用 SuspendThread 吗?
【发布时间】:2013-07-31 09:05:36
【问题描述】:

Windows 线程可以用SuspendThread() 挂起自己吗?

我可以将它从另一个中唤醒,但是它可以调用SuspendThread(GetCurrentThreadId())吗?

【问题讨论】:

标签: windows multithreading winapi


【解决方案1】:

这似乎是可能的,但稍作改动(请参阅讨论此问题的 cygwin 邮件列表here):

SuspendThread(GetCurrentThread());

我还发现 MSDN 说一个线程应该只暂停自己,但它并没有让我清楚。我引用(来自here,强调我的):

这个函数主要是为调试器设计的。它不打算用于线程同步。如果调用线程尝试获取挂起线程拥有的同步对象,则在拥有同步对象(例如互斥锁或临界区)的线程上调用 SuspendThread 可能会导致死锁。为避免这种情况,应用程序中的线程不是调试器应向其他线程发出信号以暂停自身。目标线程必须设计为监视此信号并做出适当的响应。

【讨论】:

  • 这样做的原因是当你挂起一个线程时,它不会以“安全”的方式执行此操作。它只是阻止线程运行,直到它被取消挂起。这意味着它不会释放锁。如果你给一个线程发信号让它自己挂起,那么这个挂起发生在一个已知的、明确定义的时间。换句话说,不会发生不释放锁这样的事情。作为一个类比,考虑 POSIX 中的取消点,而不是终止线程。
【解决方案2】:

是的,您可以在当前线程上使用SuspendThreadGood read on the topic

【讨论】:

    猜你喜欢
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多