pthread_kill到GCD管理的线程

时间:2017-07-08 21:19:26

标签: macos pthreads grand-central-dispatch darwin mach

我正在尝试使用pthread_kill向特定线程发送信号。我使用pthread_from_mach_thread_np()来获取句柄,然后使用pthread_kill发送信号。

这在我的其他测试中效果很好,但是现在我看到当尝试发出GCD内部创建的线程时,我从pthread_kill得到了45的返回码。

产生该线程的GCD API:

dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ ... });

出现这种情况的原因是什么?

-

要添加一些进一步的信息,我不是要试图杀死线程。 pthread_kill()是向线程发送信号的标准POSIX API。如果安装了信号处理程序,则使用trampoline将线程的上下文切换到处理程序。

虽然我尝试使用我的信号处理程序可以以更好的方式实现,但这不是问题。即使出于纯粹的学术原因,我也想了解内部发生了什么。

2 个答案:

答案 0 :(得分:4)

pthread_kill() API在工作队列线程(GCD下的工作线程)上明确禁止,并为此类线程返回ENOTSUP

这主要是为了防止在可能不期望它的代码的上下文中执行任意信号处理程序(因为这些线程是进程中许多独立子系统使用的共享资源),以及抽象执行上下文使系统有可能在将来改变它。

您可以在implementation中看到有关如何实现这一目标的详细信息。

答案 1 :(得分:0)

这是一个非常糟糕的主意。你不拥有GCDs线程池,你绝对不能从它下面杀掉它的线程。

您的问题的答案是在任何情况下都不要这样做