Можно ли создать std::future
из std::packaged_task
, который выполняется в отдельном потоке, но не всегда извлекает его результат?Безопасно ли никогда не получать результат std :: future из std :: packaged_task?
#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()
Это, кажется, работает на Clang/LIBC++: ~Result()
вызывается возвращенного результата в std::packaged_task
Wether или не get()
, в конце концов называется на std::future
, но так как я не мог найти что-нибудь в C++ документы о этот шаблон использования, я бы хотел убедиться, что он официально поддерживается.
Я действительно заметил поведение блокировки с помощью 'std :: async', поэтому я перешел на' std :: packaged_task'. Я не уверен, что вы подразумеваете под «правильностью вашего кода, становится сомнительным»? До тех пор, пока '~ Result()' гарантированно будет вызван каким-либо образом общим состоянием, то что может пойти не так? – Pol
Действительно, вы правы, если класс Result предназначен для хранения памяти. Но редко бывает, что вам придется хранить не владеющие данными. В таких случаях забыть о вызове 'get_future' было бы неверно. Если это сделано с целями (как в вашем примере), то, вероятно, хорошо, если ресурс позаботился об RAII. – Arunmu