J'utilise std :: condition_variable pour chronométrer un signal dans un programme multithread pour contrôler le flux de différentes sections critiques. Le programme fonctionne mais pendant la sortie je suis obligé d'utiliser un prédicat (kill_ == true) pour éviter de détruire des threads qui attendent toujours sur la variable std :: conditionnelle :: wait(). Je ne sais pas si c'est la bonne façon de détruire tous les fils d'attente, conseils sollicités. Voici un extrait de code:Bonne façon de détruire les threads en attente sur une variable std :: conditional_variable lors de la sortie du programme principal
class timer
{
// ...
timer(std::shared_ptr<parent_object> parent,const bool& kill)
:parent_(parent),kill_(kill){}
private:
std::condition_variable cv_command_flow_;
std::mutex mu_flow_;
const bool& kill_;
std::shared_ptr<parent_object> parent_;
};
void timer::section()
{
auto delay = get_next_delay();
std::unique_lock<std::mutex> lock(mu_flow_);
std::cv_command_flow_.wait_until(lock,delay,[] { return kill_ == true; });
if(kill_) return;
parent_->trigger();
std::cv_command_exec_.notify_all();
}
Avez-vous essayé ['notify_all'] (http://www.cplusplus.com/reference/condition_variable/condition_variable/notify_all/)? – iammilind
Problème de terminologie: voulez-vous terminer les threads ou les laisser s'exécuter jusqu'à la fin? Que considérez-vous par «destruction du fil»? –