C++ S'assurer qu'un fil est toujours joint


Exemple

Lorsque le destructeur de std::thread est appelé, un appel à join() ou detach() doit avoir été effectué. Si un thread n'a pas été joint ou détaché, alors std::terminate sera appelé par défaut. En utilisant RAII , ceci est généralement assez simple à réaliser:

class thread_joiner
{
public:

    thread_joiner(std::thread t)
        : t_(std::move(t))
    { }

    ~thread_joiner()
    {
        if(t_.joinable()) {
            t_.join();
        }
    }

private:

    std::thread t_;
}

Ceci est alors utilisé comme ça:

 void perform_work()
 {
     // Perform some work
 }

 void t()
 {
     thread_joiner j{std::thread(perform_work)};
     // Do some other calculations while thread is running
 } // Thread is automatically joined here

Cela fournit également une sécurité d'exception; Si nous avions créé notre thread normalement et que le travail effectué dans t() effectuant d'autres calculs avait généré une exception, join() n'aurait jamais été appelée sur notre thread et notre processus aurait été terminé.