Я использую std :: conditional_variable для синхронизации сигнала в многопоточной программе для управления потоком различных критических секций. Программа работает, но во время выхода я вынужден использовать предикат (kill_ == true), чтобы избежать уничтожения потоков, которые все еще ждут на std :: conditional_variable :: wait(). Я не знаю, правильно ли он уничтожил все ожидающие потоки, и попросил совета. Вот фрагмент кода:Правильный способ уничтожения потоков, ожидающих на std :: conditional_variable во время выхода основной программы
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();
}
Вы пробовали ['notify_all'] (http://www.cplusplus.com/reference/condition_variable/condition_variable/notify_all/)? – iammilind
проблема терминологии: вы хотите прекратить потоки или позволить им работать до конца. что вы считаете «уничтожением нитей»? –