你能杀死并发调度队列上的进程吗
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 可以替换您的所有代码。
我正在调整 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 可以替换您的所有代码。