为什么C++标准库中没有线程池?

And*_*kin 4 c++ multithreading threadpool c++17

自 C++11 以来,C++ 中并行/并发编程工具的数量激增:线程、异步函数、并行算法、协程\xe2\x80\xa6 但是流行的并行编程模式:线程池

\n

据我所知,标准库中没有任何内容直接实现这一点。Threading viastd::thread可以用来实现线程池,但这需要手动操作。异步函数via可以在新线程( ) 或调用线程( ) 中std::async启动。std::launch::asyncstd::launch::deferred

\n

我认为std::async可以很容易地支持线程池:通过另一个启动策略(std::launch::thread_pool),它在隐式创建的全局线程池中执行任务;或者可能有一个对象加上一个需要线程池std::thread_pool的重载。std::async

\n

是否考虑过类似的事情?如果考虑过,为什么会被拒绝?或者是否有我缺少的标准解决方案?

\n

Fra*_*eux 6

原则上std::async可以使用线程池,在我看来,允许这样做就是意图。但在实践中, 的存在thread_local使其变得困难。

cppreference开始:std::asyncstd::launch::async

[...]在新的执行线程上执行可调用对象f(所有线程局部变量都已初始化),就像由std::thread(std::forward<F>(f), std::forward<Args>(args)...)[...]生成一样

如果函数包含任何局部thread_local变量,并且std::async使用线程池,则运行该函数的行为可能std::asyncstd::thread.

一个例子可能是,thread_local第二次被同一线程调用时可能没有没有初始值。如果您要使用std::thread它,它将始终具有初始值。

行为不同的另一种方式是thread_local对象的析构函数不会以与std::async和相同的方式运行std::thread。微软尝试使用线程池就说明了这一点,我怀疑这吓跑了其他人尝试它。您可以在此处阅读有关此不一致性的信息:In Visual Studio, thread_localVariables' destructor not call when using with std::async, is this a bug?

为了完全符合要求,无论如何,实现都需要“重置”所有对象thread_local。这需要编译器支持,而且看起来非常像启动一个新线程。