检测std :: packaged_task的崩溃

时间:2019-08-13 06:22:49

标签: c++11 concurrency future packaged-task

我想检测打包的任务是否成功完成,但是在某些情况下,任务中的错误会导致线程崩溃(来自某些第三方代码)。在这些情况下,以下代码不会捕获任何异常,并且我无法说出线程崩溃了。崩溃时将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;

结束

0 个答案:

没有答案