std::packaged_task
からstd::future
を作成することは安全ですか?別のスレッドで実行されますが、必ずしもその結果を取得するとは限りませんか?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()
クラン/ libcの++上で動作しているようです
:~Result()
はstd::packaged_task
天気をによって返される結果に呼び出されたか、最終的にstd::future
で呼び出されていないget()
、しかし私は約ドキュメントC++で何かを見つけることができませんでしたので、この使用パターンは、正式にサポートされていることを確認したいと思います。
本当に 'std :: async'でブロック動作が気づいたので、' std :: packaged_task'に切り替えました。私は、あなたのコードの正しさが疑問に思うのかどうか分かりません。 '〜Result()'が共有状態によっていずれかの方法で呼び出されることが保証されている限り、何が間違っている可能性がありますか? – Pol
Resultクラスがメモリを所有するように設計されているのは確かです。しかし、あなたが所有していないデータを保持しなければならない場合はほとんどありません。そのような場合、 'get_future'を呼び出すのを忘れると正しくないでしょう。それが目的で済むなら(あなたの例のように)、資源がRAIIによって世話をされればそれはおそらく大丈夫です。 – Arunmu