CodeWalk

packaged_task使用与async对比

作者:Yahuda · 2026-05-30 12:55

请说明std::packaged_task的用途及其与std::async的区别。

回答

Yahuda

std::packaged_task包装可调用对象,将其返回值与future关联,可灵活控制执行时机和线程。

std::packaged_task<int()> task([]{ return 42; });
auto f = task.get_future();
task(); // 在当前线程执行
int r = f.get();

// 也可在特定线程执行
std::thread t(std::move(task)); t.join();

std::async的区别:

  • async自动管理线程/任务调度,简单直接
  • packaged_task不自动创建线程,执行位置更灵活
  • async默认可能延迟或异步执行(由实现决定)
  • packaged_task适合集成到线程池等自定义调度器中