Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 线程是否可以通过自己的线程ID调用SuspendThread?_Windows_Multithreading_Winapi - Fatal编程技术网

Windows 线程是否可以通过自己的线程ID调用SuspendThread?

Windows 线程是否可以通过自己的线程ID调用SuspendThread?,windows,multithreading,winapi,Windows,Multithreading,Winapi,Windows线程是否可以使用SuspendThread()挂起自身 我可以从另一个程序中唤醒它,但它是否可以调用SuspendThread(GetCurrentThreadId())?这似乎是可能的,但需要稍作修改(请参阅讨论此问题的cygwin邮件列表): 我还发现MSDN说线程应该只挂起它自己,但它并没有让我明白。我引用我的话: 此函数主要是为调试器设计的。它不打算用于线程同步。如果调用线程试图获取由挂起线程拥有的同步对象,则在拥有同步对象(如互斥对象或关键部分)的线程上调用Suspend

Windows线程是否可以使用
SuspendThread()
挂起自身


我可以从另一个程序中唤醒它,但它是否可以调用
SuspendThread(GetCurrentThreadId())

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

我还发现MSDN说线程应该只挂起它自己,但它并没有让我明白。我引用我的话:

此函数主要是为调试器设计的。它不打算用于线程同步。如果调用线程试图获取由挂起线程拥有的同步对象,则在拥有同步对象(如互斥对象或关键部分)的线程上调用SuspendThread可能会导致死锁。为了避免这种情况,应用程序中不是调试器的线程应该通知另一个线程挂起自己。目标线程必须设计为监视此信号并做出适当响应


是的,您可以在当前线程上使用
SuspendThread

可能吧,但你到底为什么要这么做,和。你实际上想做什么?除了这是一个线程挂起自己,这意味着它自己可以保证没有锁被持有等等。原因是当你挂起一个线程时,它不会以“安全”的方式来做这件事。它只是阻止线程运行,直到它解除挂起。这意味着它不会释放锁。如果你给一个线程发信号,让它挂起自己,那么这个挂起会在一个已知的、定义明确的时间发生。换句话说,不释放锁这样的事情是不可能发生的。作为类比,考虑POSIX中的取消点,而不是终止线程。
SuspendThread(GetCurrentThread());