我正在调整Linux网络代码,使其也能在iOS上运行。它使用POSIX listen()和accept()调用侦听并打开套接字连接。
我有侦听和接受新连接的调度队列,然后是管理打开连接的其他队列。
在所有队列上运行的作业都运行循环,当全局退出标志设置为true时,循环终止。
监听和接听呼叫阻塞呼叫,如果我需要关闭应用程序,运行这些呼叫的队列有时会暂停一两分钟,阻塞。(通常在接听电话中)
是否有方法终止被阻塞的进程?这里有一些讨论线程(而不是POSIX线程) 就像这个,所以说GCD中没有内置的方法。我想我可以找出哪个线程当前被阻塞,并使用POSIX调用来终止该线程,但这可能会导致GCD出现问题(我不知道如果一个或多个工作线程被终止,GCD将如何处理它)。
有人尝试过这种方法吗?
发布于 2015-11-16 14:57:31
你绝对不应该试图杀死一个GCD线程。它们不属于你;它们属于GCD。
关闭期间取消多线程应用程序中的accept的最佳方法是关闭套接字。这在关闭时特别有用,因为在套接字重用方面没有竞争条件(如果文件描述符可能被重用,则必须确保关闭正确的套接字)。
如果无法关闭套接字,则可以使用pthread_kill向线程发送信号,并向空信号处理程序发送一个空信号处理程序,以导致accept与EINTR一起失败。但你不应该用GCD做这个。GCD实际上阻止了所有可掩蔽的信号,因此它不会工作,但如果它成功了,这将是一个坏主意。GCD线程是池的一部分,并被重用。
尽管如此,如果可能的话,我确实建议将这段代码转换为使用CFStream,而不是直接调用accept。它将与系统集成得更好。有关集成原始套接字的优秀示例,CFStream和GCD,请参阅Robbie的CocoaAsyncSocket。虽然这是在ObjC中,但CFStream是一个核心基础对象,可以完全在C中管理。但是,您可能会发现CocoaAsyncSocket可以替换所有代码。
https://stackoverflow.com/questions/33737727
复制相似问题