pthread_kill 到 GCD 管理的线程

pthread_kill to a GCD-managed thread

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

这在我的其他测试中运行良好,但现在我发现,当我尝试向 GCD 内部创建的线程发出信号时,我从 pthread_kill.[=17 得到了一个 return 代码 45 =]

生成该线程的 GCD API:

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

发生这种情况的原因是什么?

——

为了补充一些进一步的信息,我并不是要终止线程。 pthread_kill() 是向线程发送信号的标准 POSIX API。如果安装了信号处理程序,线程的上下文将通过蹦床切换到处理程序。

虽然我尝试使用我的信号处理程序实现的目标可以通过更好的方式实现,但这不是问题。哪怕是纯粹的学术原因,我也想了解一下这里面到底发生了什么。

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

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

pthread_kill() API 在工作队列线程(GCD 底层的工作线程)和此类线程的 returns ENOTSUP 上被明确禁止。

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

您可以在 implementation.

中查看有关如何实现的详细信息