向量中的主题无法加入

时间:2016-06-30 18:14:13

标签: c++ c++11 vector stdvector stdthread

我想在向量中存储一组线程,并在退出程序之前将它们全部加入。尝试加入第一个线程时,无论我在集合中放置了多少,我都会收到以下错误:

system_error: thread::join failed: No such process

以下是一些演示我的问题的简单代码:

#include <thread>
#include <iostream>
#include <vector>
#include <functional>

using std::cout;
using std::endl;
using std::vector;
using std::thread;
using std::mem_fn;

int main()
{
  vector<thread> threads(1);
  threads.push_back(thread([]{ cout << "Hello" << endl; }));
  for_each(threads.begin(), threads.end(), mem_fn(&thread::join));

  // also tried --> for(thread &t : threads) t.join()
}

我正在使用以下内容构建它(尝试过clang ++ 4.2.1和g ++ 5.3.1):

g++ -o src/thread_test.o -c -std=c++14 src/thread_test.cpp -pthread
g++ -o thread_test src/thread_test.o -pthread

我在互联网上看到很多这样做的例子。 <thread><vector>合同中的某些内容是否发生了变化,导致这些示例失效?

注意:作为未来读者的一小部分,我在尝试{}赋值后最终添加了(1)构造函数参数,由于私有拷贝构造函数而失败。在试图避免复制构造函数时,我最终分配了未初始化的线程 - 粗心的错误。

1 个答案:

答案 0 :(得分:33)

  

vector<thread> threads(1);

这会创建一个可以在索引0处访问的线程。

  

threads.push_back(thread([]{ cout << "Hello" << endl; }));

这会添加第二个线程,可以在索引1处访问。

  

for_each(threads.begin(), threads.end(), mem_fn(&thread::join));

这将在join个对象上调用thread。但是,第一个从未开始,因此它不能连接。

相反,您可以将vector<thread> threads(1);替换为vector<thread> threads; threads.reserve(1);并继续使用push_back