std::async调用可否指定线程池?如何判断是否使用了线程池?
调用
std::async能否指定使用的线程池? 完全不能。C++标准规定的std::async接口没有提供任何和自定义线程池相关的参数,你能传入的执行策略只有三个可选值:std::launch::async、std::launch::deferred,或者两者的或组合。
底层用什么线程执行你的任务、这些线程是不是来自线程池、线程池的调度逻辑是什么,完全由标准库的实现自行决定,用户没有任何可干预的入口。
不支持指定的前提下,有没有办法检测
std::async是否用了线程池? 标准层面没有通用、可移植的检测方法。
因为线程池本身就不是C++标准规定的组件,不同厂商的标准库实现std::async的逻辑差异极大:
- 有的实现只要你传了
std::launch::async就直接新建一个独立线程执行,完全不碰线程池 - 有的实现会维护全局的共享线程池,所有
std::async的异步任务都扔到池子里跑 - 还有的实现会根据当前系统负载动态选择策略,轻负载开新线程,重负载走线程池
标准没有暴露出任何可以查询异步任务线程来源的API,如果你只是要针对你当前用的特定标准库做验证,可以用一些非通用的野路子:
- 连续发起多次
std::async调用,在任务里打印当前线程的ID,看有没有出现线程ID复用的情况,如果有基本可以确定底层用了线程池
不过这种检测结果只能适配你当前的运行环境,换个编译器、换个操作系统、甚至换个版本的标准库结果就可能完全不一样,没有通用参考价值。
内容的提问来源于stack exchange,提问作者Lorah Attkins
相关产品推荐
相关产品推荐

