2009-10-22 4 views
0

Je me demande ce qui se passerait si je créais un thread joignable pour écrire de grosses données sur "disque". Maintenant, les docs disent que je peux le faire en utilisant des threads POSIX. Agréable! Mais: Un autre gars chez Apple a dit, qu'une application a comme 5 secondes ou plus pour quitter lorsque l'utilisateur appuie sur le bouton d'accueil. Donc, pour ma compréhension d'un "vrai" thread non lié a le sens d'empêcher la corruption de données, mais quand iPhone OS tue juste le processus après 5 secondes de toute façon cela n'aurait pas beaucoup de sens, je suppose. Mais: Sans les threads non attachés, l'application quitterait-elle immédiatement plutôt que de se faire tuer après 5 secondes? Ou est-ce juste un mauvais mythe, et un thread jointable POSIX s'assurerait que les données sont traitées complètement avant que l'application se ferme?Est-il possible de créer un vrai thread non joint (jointable) dans iPhone OS?

Ne vous inquiétez pas, je ne prévois pas de faire quelque chose qui empêcherait l'utilisateur de ne pas pouvoir fermer l'application. Je veux juste avoir raison.

Répondre

0

Je ne suis pas sûr si l'utilisation d'un thread joignable vous permet de différer la terminaison de l'application jusqu'à ce que votre thread soit terminé et que vous le rejoigniez. Probablement pas. Vous pouvez utiliser des threads POSIX à la place de NSThread ou NSOperation/NSOperationQueue, mais vous devrez toujours prendre en compte la possibilité que l'utilisateur termine l'application.

Maintenant, la résiliation peut se produire dans l'une des deux façons possibles:

1) l'application reçoit un signal SIGTERM que vous pouvez intercepter à travers la applicationWillTerminate: méthode, qui est alors le gestionnaire de signal SIGTERM;

2) l'application reçoit SIGKILL: dans ce cas vous ne pouvez pas attraper le signal via un gestionnaire de signal et vous n'êtes pas autorisé (bien sûr) à l'ignorer en réglant la disposition du signal.

Si SIGTERM est le seul signal envoyé pour terminer l'application, vous devriez pouvoir continuer le travail dans votre thread pour sauvegarder les données et quitter normalement. Cependant, il se peut qu'après l'expiration d'un délai (les 5 secondes que vous avez mentionnées), l'application reçoive également SIGKILL et cet événement provoque sa résiliation immédiate. Cela peut être ce qui se passe réellement lorsque l'utilisateur appuie sur le bouton d'accueil: l'iPhone OS envoie SIGTERM à l'application, déclenche une minuterie et quand le délai se produit, il envoie SIGKILL. Mais rien dans la documentation ne le confirme (ou le réfute, au meilleur de ma connaissance). Pour gérer cela, vous devriez faire de votre mieux (en fonction de l'application bien sûr) pour sauvegarder l'état de l'application de manière atomique et dès que possible, et vous devriez être prêt à annuler votre thread POSIX (lorsqu'il atteint l'une des possibilités d'annulation). points) et reculer si nécessaire pour nettoyer avant de quitter.

+0

d'où provient ce signal SIGTERM, et que signifie SIGTERM? –

+0

SIGTERM est l'un des signaux POSIX standard. C'est l'iPhone OS qui envoie le signal à l'application en réponse à l'utilisateur appuyant sur le bouton d'accueil. Comme son nom l'indique, SIGTERM est synonyme de signal de terminaison. C'est la façon standard de terminer une application Unix, et, sous le capot, un iPhone OS est également une application Unix. –

+0

Ok, pour être plus précis, c'est la manière standard de terminer une application de démon Unix. –

Questions connexes