C++ 11:std :: thread汇集了吗?

luc*_*nte 39 c++ multithreading c++11 stdthread

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

现在,在C++ 11中我们有std::thread.我想标准没有说明具体的实现,所以我的问题是标准的库实现.他们是否通常选择合并方法来构造std::threads是便宜的(例如不调用pthread_createposix),或者std::thread只是一个包装器?

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

dor*_*erg 24

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

所以线程池仍然很有意义.也就是说,我看过一个视频,其中C++委员会成员讨论了关于std::async(IIRC)的线程池,但我现在找不到它.


Nic*_*las 11

A std::thread是执行的线程.期.它来自哪里,如何到达那里,是否存在一些"实际"线程等等,都与标准无关.只要它像一个线程,它可能是一个std::thread.

现在,赔率是好的,这std::thread是一个真实的OS线程,而不是从线程池或其他东西拉出的东西.但是C++ 11理论上允许将a std::thread实现为从池中提取的东西.

  • 我理解,我的问题是关于那里的实际实现. (10认同)
  • _"只要它像一个线程,它就可以是一个std :: thread."_其中"就像线程一样"意味着(除其他外)在线程启动时会重新创建`thread_local`变量并在线程停止运行,因此即使存在OS线程的底层池,也不要跨线程持久化. (9认同)

Ell*_*ott 5

std::thread应该是在抽象成本方面非常便宜,它是低级别的东西.据我了解,标准库实现可能只是尽可能地封装底层的OS机制,因此您可以假设线程创建的开销相似或相当.

我不知道任何具体的实现,但这是我从阅读C++ Concurrency In Action的第二手理解,标准建议他们使用最有效的方法实用.作者肯定认为与DIY相比,成本会或多或少地微不足道.

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

基本上,我认为没有直接回答你的问题,因为它没有明确说明.虽然听起来我们会更有可能看到非常薄的包装器实现,但我不认为库编写器如果提供效率优势就不会使用线程池.