[英]C++11: std::thread pooled?
在C ++ 03中,我使用pthread和自建的线程池,它总是保持一些线程运行(因为pthread_create
很慢),这样我就可以在不考虑性能问题的情况下为小任务启动线程。
现在,在C ++ 11中我们有std::thread
。 我想标准没有说明具体的实现,所以我的问题是标准的库实现。 他们通常选择合并方法,其中构造std::thread
是便宜的(例如,不会在posix上调用pthread_create
),还是std::thread
只是一个包装器?
换句话说,是否仍然在C ++ 11中推荐一个线程池,或者我应该只在需要时创建一个std::thread
并将性能提升到标准库?
通常, std::thread
应该是底层系统原语的最小包装器。 例如,如果您使用的是pthread
平台,则可以使用以下程序进行测试,无论您创建多少个线程,它们都是使用唯一的pthread_t
ID创建的(这意味着它们是在运行时创建的,而不是从线程池):
#include <assert.h>
#include <mutex>
#include <set>
#include <thread>
#include <vector>
#include <pthread.h>
int main() {
std::vector<std::thread> workers;
std::set<long long> thread_ids;
std::mutex m;
const int n = 1024;
for (int i = 0; i < n; ++i) {
workers.push_back(std::thread([&] {
std::lock_guard<std::mutex> lock(m);
thread_ids.insert(pthread_self());
}));
}
for (auto& worker : workers) {
worker.join();
}
assert(thread_ids.size() == n);
return 0;
}
所以线程池仍然很有意义。 也就是说,我看过一个视频,其中C ++委员会成员讨论了关于std::async
(IIRC)的线程池,但我现在找不到它。
std::thread
是一个执行线程。 期。 它来自哪里,如何到达那里,是否存在一些“实际”线程等等,都与标准无关。 只要它像一个线程,它就可以是一个std::thread
。
现在,很可能std::thread
是一个真实的OS线程,而不是从线程池或其他东西中提取的东西。 但是理论上C ++ 11确实允许将std::thread
实现为从池中提取的东西。
std::thread
应该在抽象成本方面非常便宜,它是低级别的东西。 据我了解,标准库实现可能只是尽可能地封装底层的OS机制,因此您可以假设线程创建的开销相似或相当。
我不知道任何具体的实现,但这是我从阅读C ++ Concurrency In Action的第二手理解,标准建议他们使用最有效的方法实用。 作者肯定认为与DIY相比,成本会或多或少地微不足道。
这个库在概念上与Boost类似,所以我想用Boost实现来得出一些结论不会太牵强。
基本上,我认为没有直接回答你的问题,因为它没有明确说明。 虽然听起来我们会更有可能看到非常薄的包装器实现,但我不认为库编写器如果提供效率优势就不会使用线程池。
首先,正如您所提到的,C ++标准基本上没有指定库实现。 但是C ++标准库的实现者应遵守“as-if”规则。
例如,这意味着std::thread
构造函数应该表现得就好像新线程创建了底层API的瘦包装还是高效的实现(如线程池)。 (这里,'thread'表示C ++ 11规范中的抽象执行线程 ,而不是具体的OS本机线程)
关于线程池实现;
thread_local
变量),它们应该在运行时协同工作。 所以,我假设大多数std::thread
实现只是底层线程API的包装。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.