我想在向量中存储一组线程,并在退出程序之前将它们全部加入。尝试加入第一个线程时,无论我在集合中放置了多少,我都会收到以下错误:
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)构造函数参数,由于私有拷贝构造函数而失败。在试图避免复制构造函数时,我最终分配了未初始化的线程 - 粗心的错误。
答案 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
。