dimanche 23 janvier 2022

C++20 - std::jthread

Coucou ! Cela faisait un petit moment que nous n'avions pas parlé de C++. Ça tombe bien, il y a plein de choses à dire. En particulier, causons aujourd'hui de std::jthread.

Ce n'est certes pas une révolution : il s'agit juste d'une version un petit peu plus évoluée que std::thread, qui embarque un indicateur qui permet de demander l'arrêt du thread, et qui a la propriété de demander cet arrêt, et de joindre le thread, dans le destructeur. Rien qui ne soit aisé à écrire soi-même, mais c'est du sucre syntaxique tout ce qu'il y a de plus agréable, et je trouve que cela s'approche plus de la philosophie RAII : là où l'ancien std::thread était vraiment un contrôle sur un thread, mais pouvait être détruit bien avant le thread, le nouveau std::jthread a plus une sémantique de possession, en s'assurant que le thread ne survivra pas à l'objet.

Subtilité supplémentaire: le foncteur passé à std::jthread peut prendre un paramètre supplémentaire de type std::stop_token qui permet de savoir si son propre thread doit s'arrêter.

Mais assez de parlotte, voyons le code:

#include <thread>
#include <iostream>

int main()
{
  std::jthread t
    ([](std::stop_token stoken)
     {
       while (!stoken.stop_requested())
       {
         std::cout << "Coucou !" << std::endl;
       }
     });

  using namespace std::literals::chrono_literals;
  std::this_thread::sleep_for(2s);

  return 0;
}

Grace à notre ami le std::jthread, pas besoin d'avoir un atomic qui traine, de bien penser à joindre à la fin du programme, et tout le toutim habituel. Le std::jthread nous prend par la main et s'assure que tout est bien nettoyé derrière. Sympa !