Est-il possible de créer un véritable thread non déconnectable (jointable) dans iPhone OS?

StackOverflow https://stackoverflow.com/questions/1608525

  •  05-07-2019
  •  | 
  •  

Question

Je me demande ce qui se passerait lorsque je créerais un thread pouvant être joint pour écrire des données volumineuses sur un "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 environ 5 secondes pour quitter lorsque l'utilisateur appuie sur le bouton d'accueil. Donc, pour ma compréhension, un " réel " Un fil non détaché a le sens pour empêcher la corruption des données, mais quand iPhone OS tue le processus au bout de 5 secondes de toute façon, cela n'aurait pas beaucoup de sens, je suppose.

Mais: sans 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 fil à joindre POSIX permettrait de s'assurer que les données sont traitées complètement avant la fermeture de l'application?

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 que cela soit correct.

Était-ce utile?

La solution

Je ne sais pas si l'utilisation d'un thread pouvant vous rejoindre vous permet de différer la fermeture 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 de NSOperation / NSOperationQueue, mais vous devrez toujours prendre en compte la possibilité que l'utilisateur termine l'application.

Désormais, la résiliation peut se produire de deux manières:

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

2) l'application reçoit SIGKILL: dans ce cas, vous ne pouvez pas capturer le signal via un gestionnaire de signal et vous n'êtes pas autorisé (bien entendu) à l'ignorer pour définir la disposition du signal.

Si SIGTERM est le seul signal envoyé pour mettre fin à l’application, vous devriez pouvoir continuer le travail dans votre thread pour enregistrer les données et quitter normalement. Cependant, il se peut qu’après un délai expiré (les 5 secondes que vous avez mentionnées), l’application reçoive également SIGKILL et que cet événement provoque sa fin immédiate. C'est peut-être ce qui se produit réellement lorsque l'utilisateur appuie sur le bouton d'accueil: le système d'exploitation de l'iPhone envoie SIGTERM à l'application, déclenche une minuterie et, une fois le délai écoulé, envoie SIGKILL. Mais rien dans la documentation ne le confirme (ni ne le prouve, à ma connaissance).

Pour gérer cela, vous devez faire de votre mieux (en fonction de l'application) pour enregistrer l'état de l'application de manière atomique et dès que possible. Vous devez également être prêt à annuler votre thread POSIX (lorsqu'il atteint l'un des points d'annulation possibles. ) et effectuez une restauration si nécessaire afin de nettoyer avant de quitter.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top