2016-07-30 4 views
0

Quelle est la manière la moins terrible de mettre en œuvre 'dérouler tous les threads sur la panique'? Je voudrais que chaque thread (tenter de) mourir gracieusement sur les paniques et SIGINTs (et remarque SIGKILLs?).Comment faire pour décompresser tous les threads sur la panique?

Il ne semble pas qu'il existe une méthode Rust pour interrompre les threads, donc je pense que j'implémenterais un trait semblable à runOneStep et que mes threads vérifient un booléen ou regardent la gestion d'interruption libc.

J'ai vu How can I cause a panic on a thread to immediately end the main thread?, ce qui est fondamentalement la façon hacky de définir panic=abort. J'ai aussi vu Thread::cancel() support.

+1

Pourriez-vous développer un peu plus sur votre objectif? Puisque vous avez déjà lu le post du forum Internals lié, vous comprenez pourquoi quelque chose comme 'Thread :: cancel' serait une mauvaise idée. Quel est le problème avec juste terminer le programme? – Shepmaster

+0

J'ai nettoyé sur certains threads que je voudrais être très confiant est exécuté. Avoir une surveillance de programme séparée pour la santé de cette personne fonctionnerait, mais je pense que cela ajoute plus de complexité. Ce genre de chose en Java serait fourni par un ShutDownHook, mais c'est un peu de magie d'exécution. – mfarrugi

Répondre

1

Vous ne pouvez rien faire de gracieux sur un SIGKILL. C'est ce que signifie SIGKILL. Il y a une tuerie moins austère, je pense que ça s'appelle ABORT. (Je suis un old-schooler, et je me réfère à eux par leur nombre: kill is 9, abort was, je pense, 15.)

+0

Si seulement il y avait une ressource que vous pourriez référencer pour être sûr de ce que les noms et les numéros de signaux étaient ...^_^Si OP décide de passer à un autre signal, quelle serait la solution? – Shepmaster

+0

OP demande: * graceful die ** sur panics ** et sigkills * (emphase mine); quelles solutions existent pour ce cas? – Shepmaster