Есть несколько способов справиться с этим.Если вы настроены на потоки, то вы можете использовать std::future<void>
, чтобы определить, когда он вышел:
std::promise<void> promised_thread_exit;
std::future<void> thread_exited = promised_thread_exit.get_future();
std::thread(
[] (std::promise<void> promised_thread_exit)
{
promised_thread_exit.set_value_at_thread_exit();
DoBackgroundWork();
},
std::move(promised_thread_exit));
thread.detach();
// later...
thread_exited.get();
Однако это похоже на большую работу.A std::thread
- довольно низкий уровень примитива.Если цель состоит в том, чтобы просто выполнить некоторую работу в фоновом режиме, то std::async
является лучшим вариантом:
std::future<void> work_complete = std::async(std::launch::async, DoBackgroundWork());
// later...
work_complete.get();
В любом случае, если вам нужно проверить состояние работы без блокировки, вы можете выполнитьпоэтому, ожидая на future
с таймаутом 0:
using namespace std::chrono_literals;
//...
if (work_complete.wait_for(0s) == std::future_status::ready)
{
// work has finished
}
При этом проверка состояния, подобного этому, редко необходима.Если это так, то вам следует подумать, есть ли более простая альтернатива.