Maison >développement back-end >C++ >Comment vérifier si un std::thread est toujours en cours d'exécution en C ?

Comment vérifier si un std::thread est toujours en cours d'exécution en C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-24 09:46:10508parcourir

How to Check if a std::thread is Still Running in C  ?

Comment déterminer l'état d'un std::thread en cours d'exécution

Dans cette discussion, nous explorerons une question importante en multithreading : comment vérifier si un std : :thread est toujours en cours d'exécution. Cette connaissance est cruciale pour une coordination et une surveillance efficaces des threads dans divers scénarios de programmation.

Le défi

La classe std::thread en C ne dispose pas d'une méthode pratique comme timed_join() ou joinable() explicitement conçu pour déterminer l’état d’exécution d’un thread. La méthode joinable() est principalement destinée à un objectif différent, laissant les professionnels rechercher des approches alternatives.

Solution 1 : Tirer parti de std::async et std::future

Exploiter la puissance de std : :async et std::future, nous pouvons surveiller sans effort l'état d'un thread. std::async exécute une tâche sur un thread séparé, tandis que std::future fournit un aperçu de ses résultats. En employant la fonction wait_for de std::future avec un délai d'attente nul, nous pouvons vérifier clairement l'état d'exécution du thread :

auto future = std::async(std::launch::async, [] {
    std::this_thread::sleep_for(3s);
    return 8;
});

//...
auto status = future.wait_for(0ms);
if (status == std::future_status::ready) {
  std::cout << "Thread finished" << std::endl;
} else {
  std::cout << "Thread still running" << std::endl;
}

Solution 2 : Utiliser std::promise et std::future

Si l'utilisation de std::async et std::future n'est pas réalisable, une alternative implique std::promise et std::future. Cette approche nous permet d'obtenir un futur objet directement à partir du fil :

std::promise<bool> p;
auto future = p.get_future();

//...
p.set_value(true);

Encore une fois, l'emploi de wait_for sur le futur objet fournit les informations d'état souhaitées.

Solution 3 : approche simple avec std::thread

Pour des exigences plus simples, l'approche suivante utilisant un indicateur atomique peut suffire :

std::atomic<bool> done(false);

//...
done = true;

En accédant à l'indicateur atomique, nous pouvons déterminer si le thread a terminé sa tâche.

Solutions supplémentaires

D'autres solutions incluent l'exploitation de std::packaged_task , qui fournit une intégration plus propre avec std::thread, ou utilise des mécanismes spécifiques à la plate-forme tels que les API Windows sur Windows systèmes.

Conclusion

Le choix de la meilleure solution pour vérifier l'état d'un std::thread dépend des exigences et des contraintes spécifiques de l'application. En comprenant ces méthodes, les développeurs peuvent gérer efficacement les programmes multithread et garantir le comportement souhaité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn