我想检测打包的任务是否成功完成,但是当任务中的错误导致线程崩溃(来自一些第 3 方代码)时,会有一些边缘情况。在这些情况下,下面的代码没有捕获到异常,我无法判断线程崩溃了。future_status 在崩溃时设置为就绪;但是,如果我在加入线程之前尝试使用 .get() 获取结果,则未来将在内部调用 _M_state->wait 后中止。在内部我可以看到未来的 _M_state._M_result 充满了垃圾。
谁能想到如何确定任务是否成功完成?
bool success = true;
try
{
std::packaged_task<int()> pTask(std::bind(&Method, pointerToObject, stuff));
std::future<int> ftr = pTask.get_future();
std::thread processingThread(std::move(pTask));
std::future_status status;
do
{
if (!ftr.valid()) throw std::future_error(std::future_errc::no_state);
status = ftr.wait_for(std::chrono::milliseconds(10));
std::this_thread::sleep_for(std::chrono::milliseconds(10000));
} while (status != std::future_status::ready);
processingThread.join();
}
catch (std::future_error const&) success=false;
catch (std::exception const&) success=false;
结尾