首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++11: std::线程池?

C++11: std::线程池?
EN

Stack Overflow用户
提问于 2012-10-21 07:02:36
回答 4查看 37.1K关注 0票数 46

在C++03中,我使用pthread和一个自建的线程池,这个线程池总是让两个线程保持运行(因为pthread_create很慢),这样我就可以在不考虑性能问题的情况下启动小任务的线程。

现在,在C++11中我们有了std::thread。我猜这个标准没有说明任何关于具体实现的内容,所以我的问题是关于标准库实现。他们是否通常选择一种池化方法,这样构建std::thread很便宜(例如,不在posix上调用pthread_create ),或者std::thread只是一个包装器?

换句话说,在C++11中是否仍然推荐使用线程池,或者我是否应该在需要的时候创建一个std::thread,并将性能留给标准库?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-21 07:36:55

通常,std::thread应该是底层系统原语的最小包装器。例如,如果您在pthread平台上,您可以使用以下程序测试,无论您创建多少线程,它们都是使用唯一的pthread_t ids创建的(这意味着它们是动态创建的,而不是从线程池中借用的):

代码语言:javascript
复制
#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)的线程池,但我现在找不到它。

票数 30
EN

Stack Overflow用户

发布于 2012-10-21 08:38:57

std::thread是一个执行线程。句号。它从哪里来,如何到达那里,是否有一些“实际”线程池,等等,都与标准无关。只要它像一个线程一样工作,它就可以是一个std::thread

现在,很可能std::thread是一个真实的操作系统线程,而不是从线程池或其他什么地方拉出来的东西。但从理论上讲,C++11确实允许将std::thread实现为从池中拉出的东西。

票数 13
EN

Stack Overflow用户

发布于 2012-10-21 07:15:32

就抽象成本而言,std::thread应该是非常便宜的,它是低级的东西。据我所知,标准库实现可能只会尽可能地包装底层的操作系统机制,这样你就可以假设创建线程的开销是相似的或等效的。

我不知道任何具体的实现,但我从阅读C++ Concurrency In Action的二手资料中了解到,该标准建议他们使用最有效的实用方法。作者似乎肯定认为,与DIY相比,成本或多或少可以忽略不计。

这个库在概念上类似于Boost,所以我想使用Boost实现来得出一些结论不会太牵强。

基本上,我不认为你的问题有一个直接的答案,因为它只是没有具体说明。虽然在我看来,我们更有可能看到非常薄的包装器实现,但我不认为库作者使用线程池会受到限制,如果它提供效率优势的话。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12993451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档