pthread_kill 到 GCD 管理的线程

Leo*_*ica 2 macos pthreads darwin grand-central-dispatch mach

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

\n\n

这在我的其他测试中效果很好,但现在我发现当尝试向 GCD 内部创建的线程发出信号时,我从pthread_kill.

\n\n

生成该线程的 GCD API:

\n\n
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ ... });\n
Run Code Online (Sandbox Code Playgroud)\n\n

发生这种情况有什么原因吗?

\n\n

\xe2\x80\x94-

\n\n

为了添加一些进一步的信息,我并没有试图杀死线程。pthread_kill()是向线程发送信号的标准 POSIX API。如果安装了信号处理程序,则 thread\xe2\x80\x99s 上下文将通过蹦床切换到处理程序。

\n\n

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

\n

das*_*das 5

pthread_kill()API 在工作队列线程(GCD 底层的工作线程)上是明确禁止的,并且会返回ENOTSUP此类线程。

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

您可以在实现中查看如何实现这一点的详细信息。