explorer

万丈高楼平地起,勿在浮沙筑高台

0%

[What] Effective Modern C++ :基于任务编程优于基于线程编程

要异步运行一个可调用对象,有两个选择:

  • 基于线程编程:使用std::thread创建新的线程
    1
    2
    int doAsyncWork();
    std::thread t(doAsyncWork);
  • 基于任务编程:使用std::async
    1
    auto fut = std::async(doAsyncWork);        // "fut" for "future"
    基于任务编程优于基于线程编程的原因是:
  1. 基于任务编程所需的代码略少于基于线程编程
  2. std::async返回的std::future可以获取任务的返回及异常,而std::thread则没有简单的方式来获取

    std::thread中如果抛出异常,则默认会调用到std::terminate而终止进程

  3. 线程的切换所消耗的上下文切换、cache miss 时间也较多

但并不意味着不能使用std::thread,在下面这些场合使用基于线程编程是更加合适的:

  • 需要对线程做更多的配置:这种情况下需要用到系统层的 API,std::thread提供了native_handle成员函数以完成设置。而std::future则没有
  • 需要对线程的使用做特定优化
  • 需要对线程做更高级的抽象:比如线程池这些应用