Maison > développement back-end > C++ > le corps du texte

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

Patricia Arquette
Libérer: 2024-11-24 09:46:10
original
421 Les gens l'ont consulté

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;
}
Copier après la connexion

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);
Copier après la connexion

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;
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal