Comment mettre fin ou l'arrêt d'un thread détaché en c++?
Je suis intéressé par la résiliation de/à l'arrêt et la mise à mort d'une rupture du thread en c++. Comment cela peut-il être fait?
void myThread()
{
int loop = 0;
while(true)
{
std::this_thread::sleep_for(std::chrono::seconds(5));
++loop;
}
}
void testThread()
{
std::thread globalThread(myThread);
globalThread.detach();
}
int main(void)
{
testThread();
for(unsigned int i=0; i < 1000; i++)
{
cout << "i = " << i << endl;
}
return 0;
}
La raison pour laquelle je voudrais "stop"/"mettre fin" à la globalThread() c'est parce que valgrind listes que c'est un "peut-être" perdu "" type de fuite de mémoire (152 octets). Quelle est la meilleure façon de traiter ce problème?
- Connexes/dupliquer: stackoverflow.com/q/12207684
- merci
- Pour réitérer ce qui est dit sur cette question et d'ailleurs, ce que vous faites maintenant, et même ce que vous semblez vouloir faire, c'est dangereux. Le thread principal de retourner tue
globalThread
dans un non-gracieux de la mode, et la seule "bonne" façon de faire les choses est d'avoir le thread principal envoyez une demande viamutex
, etc., pour briser la boucle, et ont le thread principaljoin
attendre un arrêt progressif de la reconnaissance. - Check this out - [MA SOLUTION][1] . J'ai répondu à la même question . [1]: stackoverflow.com/a/32338982/5163650
- Essayez TerminateThread() si c'est Windows. On dirait qu'il pourrait être Windows basé sur les appels de fonction.
Vous devez vous connecter pour publier un commentaire.
Il n'existe pas de dispositions pour arrêter un autre thread; si elle est détachée, ou juxtaposables.
La seule façon d'arrêter un thread, est le fil de retour de la première fonction de thread.
Dans ce cas particulier, je vous suggère les modifications suivantes:
std::mutex
, le booléen est initialisé àfalse
std::unique_lock
, prendre le bool valeur, puis déverrouille le mutex. Après le déverrouillage des mutex, si le booléen esttrue
, sortir de la boucle, et retour.true
, déverrouille le mutex, puis rejoindre le filCe n'est pas parfait, car il pourrait prendre jusqu'à cinq secondes pour le deuxième thread pour vérifier l'bool drapeau, et retour. Mais, ce serait la première tep.
mutex
est exagéré pour un simple drapeau. Me semble plus comme un travail pouratomic<bool>
ouatomic_flag
.main()
sorties.boost::thread::interrupt
... parfois. En théorie, il est probablement préférable de nous forcer à le faire explicitement, même si cela signifie que beaucoup de chronométrés variable de condition attend et autres joyeusetés.Vous pourrait passer en dessous de la Norme C++ et utiliser OS des fonctions spécifiques, telles que l'envoi de votre propre processus d'un signal alors que le signal de masque, de sorte qu'il est livré uniquement pour le détachement du fil - un gestionnaire peut définir un indicateur qui est interrogé à partir de votre fil. Si votre routine principale attend plus que le sondage période de plus de un peu, vous pouvez le deviner, il devrait avoir résilié ;-P. général, de La même idée peut être utilisé avec n'importe quel autre mécanisme de signalisation, tels que l'atome de fin-asap variable d'indicateur.
Sinon, et seulement en dernier recours, il y a
pthread_cancel
et similaires. Notez que async annulation de ce genre est un célèbre et dangereux en général, vous devez être attentif à ce que le fil de résiliation ne peut pas être n'importe quel code avec les verrouillé/prises ressources ou vous pouvez avoir des blocages, des fuites, et/ou un comportement indéterminé. Par exemple, votre code appellestd::this_thread::sleep_for(std::chrono::seconds(5));
- ce si qui demande à l'OS pour un rappel lors de l'expiration de l'intervalle, mais la fonction de poursuivre par la suite utilise la résiliation pile du thread? Un exemple de cas où il peut être sûr c'est que si le fil fait un simple numéro de croquer dans une boucle à l'intérieur de votre application.Sinon Sam la réponse de documents une alternative si vous éviter de détacher le fil dans la première place....
On n'est pas à proprement l'arrêt d'un thread détaché. Cela permettrait de besoin en attente pour le nettoyage terminé, et vous ne pouvez le faire que si le thread est recrutables.
Considérons, par exemple, si le thread est titulaire d'un mutex qu'un autre thread doit acquérir afin d'proprement arrêter. La seule façon de proprement fermer ce thread serait de l'amener à la libération, qui mutex. Qui obligerait le thread de la coopération.
Examiner si le thread a ouvert un dossier et détient un verrou sur le fichier. L'abandon de la fil de laisser le fichier verrouillé jusqu'à ce que le processus se termine.
Examiner si le thread est titulaire d'un mutex qui protège certains partagée de l'état et a mis qu'un état partagé temporairement dans un état incohérent. Si vous résiliez le fil, soit le mutex ne sera jamais publié ou le mutex sera publié avec les données protégées dans un état incohérent. Cela peut provoquer des plantages.
Vous avez besoin d'un thread de coopération proprement arrêter.