你能杀死并发调度队列上的进程吗

Can you kill a process on a conncurrent dispatch queue

我正在调整 Linux 网络代码以在 iOS 上也适用 运行。它使用 POSIX listen()accept() 调用来侦听和打开套接字连接。

我有侦听和接受新连接的调度队列,然后是管理打开连接的其他队列。

所有队列上的作业 运行ning 都有 运行 循环,当全局退出标志设置为 true 时终止。

listen 和 accept 调用是阻塞调用,如果我需要关闭应用程序,排队 运行 这些调用有时会停滞一两分钟,被阻塞。 (通常在 accept 调用中。)

有没有办法终止被阻塞的进程? SO 上有 讨论线程 (不是 POSIX 线程)like this one 说 GCD 中没有内置方法。我想我可以弄清楚哪个线程当前被阻塞并使用 POSIX 调用来终止该线程,但这可能会导致 GCD 出现问题(我不知道如果它的一个或多个工作线程,GCD 将如何处理它被终止了。)

有人尝试过这种方法吗?

您绝对不应该尝试终止 GCD 线程。他们不属于你;他们属于 GCD。

关闭期间在多线程应用程序中取消 accept 的最佳方法是关闭套接字。这在关闭期间特别有用,因为套接字重用没有竞争条件(如果文件描述符可能被重用,您必须确保关闭正确的套接字)。

如果无法关闭套接字,您可以使用 pthread_kill 和空信号处理程序向线程发送信号,以导致 accept 失败并显示 EINTR。但是你不应该为此使用 GCD。 GCD 实际上会阻止所有可屏蔽信号,因此它不会起作用,但如果它起作用,那将是一个坏主意。 GCD 线程是池的一部分并被重用。

综上所述,如果可能的话,我真的建议将此代码转换为使用 CFStream 而不是直接调用 accept。它将更好地与系统集成。有关集成原始套接字 CFStream 和 GCD 的优秀示例,请参阅 Robbie Hanson 的 CocoaAsyncSocket。虽然这是在 ObjC 中,但 CFStream 是一个 Core Foundation 对象,可以完全在 C 中进行管理。但是,您可能会发现 CocoaAsyncSocket 可以替换您的所有代码。