开玩笑了,因为在async和future的解释中是写了会新开一个线程去执行任务的。
那我们在不看源代码的情况下怎么验证这个事?

源码

// async example 02.cpp
#include <iostream>       // std::cout
#include <future>         // std::async, std::future

// a non-optimized way of checking for prime numbers:
bool is_prime (int x) {
  std::cout << "Calculating. Please, wait...\n";
  for (int i=2; i<x; ++i) if (x%i==0) return false;
  return true;
}

int main ()
{
  // call is_prime(313222313) asynchronously:
  std::future<bool> fut = std::async (is_prime,313222313);

  std::cout << "Checking whether 313222313 is prime.\n";
  // ...

  bool ret = fut.get();      // waits for is_prime to return

  if (ret) std::cout << "It is prime!\n";
  else std::cout << "It is not prime.\n";

  return 0;
}

编译运行结果

看下面编译和执行的结果:

[root@lh test]# g++ 02.cpp -o 02 -std=c++11
[root@lh test]# ./02
Checking whether 313222313 is prime.
terminate called after throwing an instance of 'std::system_error'
  what():  Unknown error -1
Aborted (core dumped)
[root@lh test]# g++ 02.cpp -o 02 -std=c++11 -lpthread
[root@lh test]# ./02
Checking whether 313222313 is prime.
Calculating. Please, wait...
It is prime!

结论

从结果中可以看出,当编译的时候不关联lpthread库文件运行时会coredump,反之正常。
可以说明async、future是单独开线程运行的,同理的还有promise和packaged_task。
而future中的wait_for也很容易理解,和condition_variable::wait_for是不是很像?
所以,C++11中的轻量级线程本身还是通过线程实现的,在代码编写中实现了轻量,在性能上可能就不是了。
因为没有线程池,所以每次执行异步的时候都会创建、析构线程,客户端编程无所谓,服务端编程效率可就不高了。

引申

那async是否可以在线程池里来跑呢?答案是可以的,可以参见boost::thread中的synchronization.html。
不过那不是C++11里的async了,async的原型如下:
BOOST_THREAD_FUTURE
async(Executor& ex, R(*f)(BOOST_THREAD_FWD_REF(ArgTypes)...), BOOST_THREAD_FWD_REF(ArgTypes)... args)

posted on 2021-03-15 18:32  步孤天  阅读(226)  评论(0编辑  收藏  举报