У меня есть функция foo:
void foo(){
//Command set A
std::this_thread::sleep_for(100s);
//Command set B
}
Первая часть, которая Command set A
должен заблокировать исполнение. Тем не менее sleep
часть и //Command set B
не должен блокировать выполнение и не возвращает никаких данных.
Поэтому я реализую это следующим образом:
void foo(){
//Command set A
std::thread t([](){
std::this_thread::sleep_for(100s);
//Command set B
}
t.detach()
}
Я использовалdetach
правильно здесь? Это правильное место для использования detach
? Есть ли лучшее решение?
detach
редко является правильным решением. Если делает именно то, что говорит: он удаляет связь между std::thread
объект и фактический поток. Поток продолжает работать до тех пор, пока не завершится сам по себе, но ваша программа потеряла контроль над ним, если вы явно не реализуете связь с потоком (например, через очередь сообщений).
Вещи становятся проблематичными, если потоки все еще активны, когда ваша программа заканчивается. Ваш процесс находится в процессе высвобождения своих ресурсов и умирания, но поток весело перемещается, используя некоторые из этих ресурсов. Так как все высвобождаются ресурсы, даже самые простые (например, низкоуровневая среда выполнения C ++), что является рецептом для разгона. Скорее всего, ваша программа потерпит крах при выходе.
Заглянуть в std::async
для прямой замены. Он запускает задачу асинхронно и немедленно возвращает std::future
, Даже если задача не возвращает никаких данных, будущее — это дескриптор, за которым вы можете удерживать и при выходе из программы проверять, все ли еще работает поток, и, при необходимости, дождаться его завершения.
Других решений пока нет …