Is it safe to create a std::future
from a std::packaged_task
, which executes on a separate thread, but not always retrieve its result?
#include <future>
#include <thread>
class Result {
Result() {}
~Result() {}
};
void foo() {
std::packaged_task<Result()> task(..);
auto future = task.get_future();
std::thread thread(std::move(task), ...);
thread.detach();
if (future.wait_for(std::chrono::milliseconds(timeout_ms)) == std::future_status::ready) {
auto result = future.get(); <--- Task didn't take too long, retrieve future result
...
}
} <--- Task is taking too long, just abort and never call future.get()
It seems to work on Clang / libc++: ~Result()
is called on the returned result by the std::packaged_task
wether or not get()
is eventually called on the std::future
, but since I couldn't find anything in the C++ docs about this usage pattern, I'd like to make sure it's officially supported.
std::async
indeed, that's why I switched tostd::packaged_task
. I'm not sure what you mean bycorrectness of your code becomes questionable
? As long as~Result()
is guaranteed to be called either way by the shared state, then what could go wrong? – Bamby