为什么C++标准库中没有线程池? [复制]

2024-05-09

自 C++11 以来,C++ 中并行/并发编程工具的数量激增:线程、异步函数、并行算法、协程……但是流行的并行编程模式又如何呢:线程池 https://en.wikipedia.org/wiki/Thread_pool?

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

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

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


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

From 参考参数 https://en.cppreference.com/w/cpp/thread/async on std::async with std::launch::async:

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

如果该函数包含任何本地thread_local变量,并且如果std::async使用线程池,运行该函数的行为将std::async可能与行为不同std::thread.

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

行为不同的另一种方式是thread_local对象的析构函数不会以相同的方式运行std::async and std::thread。微软尝试使用线程池就说明了这一点,我怀疑这吓跑了其他人尝试它。您可以在此处阅读有关此不符合项的信息:在视觉工作室中,thread_local与 std::async 一起使用时未调用变量的析构函数,这是一个错误吗? https://stackoverflow.com/questions/50897768/in-visual-studio-thread-local-variables-destructor-not-called-when-used-with.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么C++标准库中没有线程池? [复制] 的相关文章

随机推荐