Maison  >  Article  >  développement back-end  >  Programmation simultanée C++ : comment terminer et annuler un thread ?

Programmation simultanée C++ : comment terminer et annuler un thread ?

WBOY
WBOYoriginal
2024-05-06 14:12:01823parcourir

Les mécanismes de terminaison et d'annulation de thread en C++ incluent : Terminaison de thread : std::thread::join() bloque le thread actuel jusqu'à ce que le thread cible termine son exécution ; std::thread::detach() détache le thread cible de la gestion des threads. Annulation de thread : std::thread::request_termination() demande au thread cible de terminer l'exécution ; std::thread::get_id() obtient l'ID du thread cible et peut être utilisé avec std::terminate() pour terminer immédiatement la cible. fil de discussion. En pratique, request_termination() permet au thread de décider du moment de la fin, et join() garantit que le thread de travail termine son exécution avant la sortie du thread principal. Notez que l'annulation d'un thread n'est pas toujours respectée et que la fin d'un thread peut entraîner un comportement indéfini.

Programmation simultanée C++ : comment terminer et annuler un thread ?

Programmation simultanée C++ : Comment effectuer la terminaison et l'annulation d'un thread ?

Dans les applications multithread, la terminaison et l'annulation des threads sont des opérations cruciales lorsqu'un thread spécifique ou ses tâches ne sont plus nécessaires. C++ fournit plusieurs mécanismes pour implémenter la terminaison et l'annulation des threads :

Terminaison du thread

  • std::thread::join() : bloque le thread actuel jusqu'à ce que le thread cible termine son exécution. std::thread::join():阻塞当前线程,直到目标线程完成执行。
  • std::thread::detach():从线程管理中分离目标线程。线程将继续执行,但无法再通过其 std::thread 对象访问。

线程取消

  • std::thread::request_termination():请求目标线程终止执行。线程可以决定是否尊重此请求。
  • std::thread::get_id():获取目标线程的 ID,该 ID 可以传递给 std::terminate() 函数。这会立即终止目标线程。

实战案例

考虑一个示例,其中创建了两个线程:主线程和工作线程。工作线程执行无限循环,而主线程等待用户输入,然后终止工作线程:

#include <iostream>
#include <thread>

void work_thread() {
    while (true) {
        // 无限循环
    }
}

int main() {
    std::thread worker(work_thread);

    std::cout << "按回车键终止工作线程:" << std::endl;
    std::cin.get();

    worker.request_termination();
    worker.join();

    return 0;
}

要点

  • request_termination() 允许工作线程决定何时终止自身。
  • join()
  • std::thread::detach() : détache le thread cible de la gestion des threads. Le thread continuera à s'exécuter mais ne sera plus accessible via son objet std::thread.

Thread Cancel

  • std::thread::request_termination() : demande au thread cible de terminer l'exécution. Le fil de discussion peut décider d'honorer ou non cette demande.
  • std::thread::get_id() : Récupère l'ID du thread cible, qui peut être transmis à la fonction std::terminate(). Cela met immédiatement fin au thread cible.
🎜🎜🎜Cas pratique🎜🎜🎜Considérons un exemple où deux threads sont créés : le thread principal et le thread de travail. Le thread de travail exécute une boucle infinie pendant que le thread principal attend l'entrée de l'utilisateur, puis termine le thread de travail : 🎜rrreee🎜🎜Points🎜🎜🎜🎜request_termination() permet au thread de travail de décider quand se terminer lui-même. 🎜🎜join() garantit que le thread de travail termine son exécution avant la sortie du thread principal. 🎜🎜🎜🎜Notes🎜🎜🎜🎜L'annulation du fil de discussion n'est pas toujours respectée, surtout si le fil effectue une section critique ou une autre opération ininterrompue. 🎜🎜La terminaison d'un fil de discussion peut entraîner un comportement indéfini, alors utilisez-le avec prudence. 🎜🎜

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