在C++03中,我使用pthread和一个自建的线程池,这个线程池总是让两个线程保持运行(因为pthread_create很慢),这样我就可以在不考虑性能问题的情况下启动小任务的线程。
现在,在C++11中我们有了std::thread。我猜这个标准没有说明任何关于具体实现的内容,所以我的问题是关于标准库实现。他们是否通常选择一种池化方法,这样构建std::thread很便宜(例如,不在posix上调用pthread_create ),或者std::thread只是一个包装器?
换句话说,在C++11中是否仍然推荐使用线程池,或者我是否应该在需要的时候创建一个std::thread,并将性能留给标准库?
发布于 2012-10-21 07:36:55
通常,std::thread应该是底层系统原语的最小包装器。例如,如果您在pthread平台上,您可以使用以下程序测试,无论您创建多少线程,它们都是使用唯一的pthread_t ids创建的(这意味着它们是动态创建的,而不是从线程池中借用的):
#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)的线程池,但我现在找不到它。
发布于 2012-10-21 08:38:57
std::thread是一个执行线程。句号。它从哪里来,如何到达那里,是否有一些“实际”线程池,等等,都与标准无关。只要它像一个线程一样工作,它就可以是一个std::thread。
现在,很可能std::thread是一个真实的操作系统线程,而不是从线程池或其他什么地方拉出来的东西。但从理论上讲,C++11确实允许将std::thread实现为从池中拉出的东西。
发布于 2012-10-21 07:15:32
就抽象成本而言,std::thread应该是非常便宜的,它是低级的东西。据我所知,标准库实现可能只会尽可能地包装底层的操作系统机制,这样你就可以假设创建线程的开销是相似的或等效的。
我不知道任何具体的实现,但我从阅读C++ Concurrency In Action的二手资料中了解到,该标准建议他们使用最有效的实用方法。作者似乎肯定认为,与DIY相比,成本或多或少可以忽略不计。
这个库在概念上类似于Boost,所以我想使用Boost实现来得出一些结论不会太牵强。
基本上,我不认为你的问题有一个直接的答案,因为它只是没有具体说明。虽然在我看来,我们更有可能看到非常薄的包装器实现,但我不认为库作者使用线程池会受到限制,如果它提供效率优势的话。
https://stackoverflow.com/questions/12993451
复制相似问题