【发布时间】:2021-11-10 10:59:15
【问题描述】:
自 C++11 以来,C++ 中并行/并发编程工具的数量激增:线程、异步函数、并行算法、协程……但是流行的并行编程模式:thread pool?
据我所知,标准库中没有任何东西直接实现这一点。通过std::thread进行线程化可以用来实现线程池,但这需要人工。通过std::async 的异步函数可以在新线程(std::launch::async)或调用线程(std::launch::deferred)中启动。
我认为 std::async 可以很容易地支持线程池:通过另一个启动策略 (std::launch::thread_pool) 在隐式创建的全局线程池中执行任务;或者可能有一个std::thread_pool 对象加上std::async 的重载,它需要一个线程池。
是否考虑过这样的事情,如果考虑过,为什么会被拒绝?或者是否有我缺少的标准解决方案?
【问题讨论】:
-
你为什么确定
std::async不使用线程池? -
要么是因为1.它没有被提议要么2.这样的提议没有被接受。
-
我不知道,认为他们想将 stl 限制在更原始的构建块上。不,没有标准的解决方案,但我有一个。
-
将线程池纳入标准并不容易。我不知道它是如何详细介绍的,但考虑到 C++11 引入了
std::thread,而只有 C++20 引入了std::jthread。我想在 C++20 引入std::jthread之前需要时间来收集新线程工具的经验,这仍然是低水平的。我希望更高级别的抽象更不容易标准化 -
有许多不同类型的线程池,为了某些目的选择“最好的”需要非常详细的应用程序知识和(通常)主机系统的属性。这些特征增加了就应该标准化的内容达成一致的难度。对线程池的标准化支持(比如)针对 Windows 进行了良好调整,但针对其他操作系统调整不佳,这与 C++ 的核心理念背道而驰。
标签: c++ multithreading c++17 threadpool