Macos pthread_kill到GCD管理的线程
我试图用pthread_kill向特定线程发送信号。我使用pthread_from_mach_thread_np获得一个句柄,然后使用pthread_kill发送信号 这在我的其他测试中运行得很好,但现在我看到,当试图向GCD内部创建的线程发送信号时,我从pthread_kill获得了45的返回代码 生成该线程的GCD API:Macos pthread_kill到GCD管理的线程,macos,pthreads,grand-central-dispatch,darwin,mach,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), ^{ ... }); 发
dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0), ^{ ... });
发生这种情况的原因是什么
--
为了补充更多的信息,我并没有试图杀死线程。pthread_kill是向线程发送信号的标准POSIX API。如果安装了信号处理程序,线程的上下文将通过蹦床切换到处理程序
虽然我尝试使用我的信号处理程序实现的目标可以通过更好的方式实现,但这在这里不是问题。即使纯粹出于学术原因,我也想了解这里的内部情况。这是一个非常糟糕的想法。您不拥有GCDs线程池,并且绝对不能从它下面杀死它的线程 您的问题的答案是,在任何情况下都不要这样做。工作队列线程上特别禁止使用pthread\u kill API作为GCD的底层工作线程,并为这些线程返回ENOTSUP 这主要是为了防止在可能不希望执行的代码上下文中执行任意信号处理程序,因为这些线程是进程中许多独立子系统使用的共享资源,并抽象出该执行上下文,以便系统将来可以自由更改它
您可以在中看到如何实现这一点的详细信息。我不想杀死线程。我安装了一个信号处理程序,并使用该处理程序获取回溯地址。Grep Parker已经建议在没有信号的情况下使用mach API来实现这一点,但问题仍然纯粹是出于学术原因——这些线程有何不同。恕我直言,您的答案不是答案。45=ENOTSUP,即操作不是supported@Rob是的,我在头球上看到了。但问题是为什么;这些线程有何不同?在中,它们明确警告块不能调用pthread_kill。@Rob有趣的文档,谢谢。然而,我不确定这是什么原因。我不是从块调用pthread_kill。块只是一个例子。正如它所说的,一般来说,您的应用程序不能删除或修改它没有创建的对象或数据结构。你不知道什么代码会收到信号。