Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 是否可以终止当前调度队列上的进程_Ios_Grand Central Dispatch - Fatal编程技术网

Ios 是否可以终止当前调度队列上的进程

Ios 是否可以终止当前调度队列上的进程,ios,grand-central-dispatch,Ios,Grand Central Dispatch,我正在修改Linux网络代码,使其也能在iOS上运行。它使用POSIXlisten()和accept()调用来侦听和打开套接字连接 我有侦听和接受新连接的调度队列,还有管理打开的连接的其他队列 所有队列上运行的作业都运行循环,当全局退出标志设置为true时,循环终止 接听和接听电话会阻塞通话,如果我需要关闭应用程序,运行这些通话的队列有时会暂停一两分钟,阻塞。(通常在接受呼叫中。) 是否有办法终止被阻止的进程?这里有讨论线程(而不是POSIX线程),所以说GCD中没有内置的方法。我想我可以找出哪

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

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

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

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

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


有人尝试过这种方法吗?

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

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

如果无法关闭套接字,则可以使用
pthread_kill
向线程发送信号,并使用空信号处理程序使
接受
失败,并使用
EINTR
。但是你不应该用GCD来做这个。GCD实际上会屏蔽所有可屏蔽的信号,所以它不会工作,但如果真的这样做了,那将是一个坏主意。GCD线程是池的一部分,可以重用


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

关闭套接字就行了。谢谢设置作业检查的全局退出标志后,我会等待几秒钟,如果作业尚未终止,我会关闭它们所服务的套接字。这会导致accept和listen函数立即返回,正如您所建议的那样。谢谢。这是与Linux共享的跨平台代码,因此我们对特定于iOS的更改越少越好。至于易用性,如果其他条件相同,我宁愿使用Cocoa touch类。我发现核心基金会有点痛苦(即使我是一个C程序员,从现在开始,我更喜欢在Objtovi-C或SWIFT中工作。这只是一个不可能的情况)。