Функция, которая выполняет асинхронную работу

У меня есть функция 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? Есть ли лучшее решение?

1

Решение

detach редко является правильным решением. Если делает именно то, что говорит: он удаляет связь между std::thread объект и фактический поток. Поток продолжает работать до тех пор, пока не завершится сам по себе, но ваша программа потеряла контроль над ним, если вы явно не реализуете связь с потоком (например, через очередь сообщений).

Вещи становятся проблематичными, если потоки все еще активны, когда ваша программа заканчивается. Ваш процесс находится в процессе высвобождения своих ресурсов и умирания, но поток весело перемещается, используя некоторые из этих ресурсов. Так как все высвобождаются ресурсы, даже самые простые (например, низкоуровневая среда выполнения C ++), что является рецептом для разгона. Скорее всего, ваша программа потерпит крах при выходе.

Заглянуть в std::async для прямой замены. Он запускает задачу асинхронно и немедленно возвращает std::future, Даже если задача не возвращает никаких данных, будущее — это дескриптор, за которым вы можете удерживать и при выходе из программы проверять, все ли еще работает поток, и, при необходимости, дождаться его завершения.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]