21 June 2023

C++ 核心指南目录

“Think in terms of tasks, rather than threads”

理由

线程是技术实现上的概念,是以机器时间考虑问题。而任务则是应用术语,某些你想要做的事情,也有可能和其他任务并行执行。应用概念更容易进行分析。

例子

void some_fun(const std::string& msg)
{
    // bad: less expressive and more error-prone
    std::thread publisher([=] { std::cout << msg; });

    auto pubtask = std::async([=] { std::cout << msg; });  // OK
    // ...
    publisher.join();
}

注意

async() 是个例外。这个标准库函数是底层、面向机器、线程+锁层级的。它是一个必要的基础功能。但是,我们必须提升其抽象层级:为了提高工作效率、提高可靠性、提高性能。这里是关于是否使用高层抽象/面向应用的库的一个争论点。如果可能,可以基于标准库函数构建。