一:概述
从 任务 的角度思考问题,而不是直接操作 线程,可以让程序设计更加高效和安全。通过使用更高层次的抽象工具(如 std::async
),这样可以减少对底层细节的关注,专注于业务逻辑,同时减少出错的可能性。
线程是一种实现概念,是一种从机器层面思考问题的方式。任务则是一种应用概念,表示某个你希望完成的操作,最好是可以与其他任务并发执行的操作。应用层的概念更容易推理和理解。
二:示例
void some_fun(const std::string& msg)
{
std::thread publisher([=] { std::cout << msg; }); // 不好:表达能力较差
// 并且更容易出错
auto pubtask = std::async([=] { std::cout << msg; }); // 可以接受
// ...
publisher.join();
}
除 std::async()
外,标准库的功能主要是低级的、面向机器的,主要是线程和锁的层次。这是必要的基础,但我们必须尝试提高抽象层次:为了提升生产力、可靠性和性能。这也成为了使用更高级、更面向应用的库的有力理由(如果可能的话,这些库通常构建在标准库的基础之上)。