パッケージ化されたタスクが正常に完了したかどうかを検出したいのですが、タスクのエラーが原因でスレッドがクラッシュするというエッジケースがいくつかあります (一部のサードパーティコードから)。これらの場合、以下のコードでは例外がキャッチされず、スレッドがクラッシュしたことを知ることができません。future_status は、クラッシュ時に準備完了として設定されます。ただし、スレッドに参加する前に .get() で結果を取得しようとすると、future は内部で _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;
終わり