我想知道当我创建一个可连接的线程来将一些大数据写入“磁盘”时会发生什么。现在,文档说我可以通过使用POSIX线程来实现。太好了!但是:Apple的另一个人说,当用户按下主页按钮时,应用程序有5秒左右的时间退出。因此,对于我的理解,“真正的”非分离线程具有防止数据损坏的意义,但是当iPhone OS在5秒之后就完全杀死了这个过程时,我认为没有多大意义。
但是:如果没有非分离的线程,应用程序会立即退出而不是在5秒后被杀死吗?或者这只是一个不好的神话,POSIX可连接线程会确保在应用程序退出之前完全处理数据?
别担心,我不打算做一些会阻止用户无法关闭应用的内容。我只是想做到这一点。
答案 0 :(得分:0)
我不确定使用可连接线程是否允许您推迟应用程序终止,直到您的线程完成并加入它。可能不是。您可以使用POSIX线程代替NSThread或NSOperation / NSOperationQueue,但您仍需要考虑用户终止应用程序的可能性。
现在,终止可能以两种可能的方式之一发生:
1)应用程序收到一个SIGTERM信号,您可以通过applicationWillTerminate:方法拦截该信号,然后是SIGTERM信号处理程序;
2)应用程序接收SIGKILL:在这种情况下,您无法通过信号处理程序捕获信号,并且当然不允许您忽略它设置信号处理。
如果SIGTERM是发送终止应用程序的唯一信号,那么您应该能够继续线程中的工作来保存数据并正常退出。但是,可能是在超时(您提到的5秒)之后,应用程序也会收到SIGKILL,此事件会立即终止。这可能是用户按下主页按钮时实际发生的情况:iPhone OS将SIGTERM发送到应用程序,触发计时器,当超时发生时,它发送SIGKILL。但是文档中没有任何内容证实了这一点(或者据我所知,反驳了它)。
要管理这个,你应该尽力(当然是应用程序)以原子方式尽快保存应用程序状态,你应该准备取消你的POSIX线程(当它到达一个可能的取消点时并根据需要回滚以便在退出之前进行清理。