首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >您能杀死连接当前调度队列上的进程吗?

您能杀死连接当前调度队列上的进程吗?
EN

Stack Overflow用户
提问于 2015-11-16 14:28:07
回答 1查看 1.2K关注 0票数 1

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

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

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

监听和接听呼叫阻塞呼叫,如果我需要关闭应用程序,运行这些呼叫的队列有时会暂停一两分钟,阻塞。(通常在接听电话中)

是否有方法终止被阻塞的进程?这里有一些讨论线程(而不是POSIX线程) 就像这个,所以说GCD中没有内置的方法。我想我可以找出哪个线程当前被阻塞,并使用POSIX调用来终止该线程,但这可能会导致GCD出现问题(我不知道如果一个或多个工作线程被终止,GCD将如何处理它)。

有人尝试过这种方法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-16 14:57:31

你绝对不应该试图杀死一个GCD线程。它们不属于你;它们属于GCD。

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

如果无法关闭套接字,则可以使用pthread_kill向线程发送信号,并向空信号处理程序发送一个空信号处理程序,以导致acceptEINTR一起失败。但你不应该用GCD做这个。GCD实际上阻止了所有可掩蔽的信号,因此它不会工作,但如果它成功了,这将是一个坏主意。GCD线程是池的一部分,并被重用。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33737727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档