我正在尝试在循环内创建不同的线程并将它们存储在线程 vector 中。
编辑 1:线程数由用户指定。
const int numThreads = stoi(argv[3]);
初始代码:
vector<thread> vectorThreadsFFT{(unsigned long) (numThreads)};
for (int i = 0; i < numThreads; ++i) {
vectorThreadsFFT.emplace_back(
move(thread{FFT, ref(vectorBuffersUC), ref(vectorBuffersCD), ref(i), ref(numThreads)}));
}
编辑 2:我在最后加入线程。
for (int i = 0; i < numThreads; ++i) {
vectorThreadsFFT[i].join();
}
当我调试代码时,出现段错误(信号 = SIGABRT)。我已经尝试删除 move 子句并通过 push_back()
更改 emplace_back()
,但我仍然得到相同的结果。
编辑 3: 当我只为另一个函数创建一个线程时,有时(但不是每次)它仍然会崩溃,例如:
thread th2{separator, ref(vectorBuffersUC), ref(numThreads), ref(nitems)};
哪个header是这样的:
void separator(vector<unique_ptr<lockedBufferUC>> &vectorBuffersUC, int numThreads, const long nitems){}
我开始怀疑这是因为我给 vector 的参数以及函数如何接收它们。
我是否遗漏了有关 C++11 和线程管理的内容?
请随时询问更多详细信息或代码。
尝试过的解决方案:
- 预留空间
- 按值传递 i 的引用
最佳答案
代码没有按照您的预期执行。
vector<thread> vectorThreadsFFT{(unsigned long) (numThreads)};
这会正确调整 vector 的大小以容纳 numThreads
元素。但是,这种在 emplace_back
或 push_back
之后的初始化将在 numThreads
索引而不是 0
处添加一个元素,如下所示你会期望。
这里要做的为数不多的正确事情之一是先reserve
vector,然后再执行emplace_back
。
此外,move
不是必需的。通过优化,编译器足够智能,可以进行就地构建。
另一件事是,您必须加入
线程,除非您分离
它。 joinable
线程如果未加入销毁调用 std::terminate
。
const int numThreads = stoi(argv[3]);
vector<thread> vectorThreadsFFT;
vectorThreadsFFT.reserve(numThreads);
for (int i = 0; i < numThreads; ++i) {
vectorThreadsFFT.emplace_back(
std::thread {FFT, ref(vectorBuffersUC), ref(vectorBuffersCD), i, ref(numThreads)} );
}
for (int i = 0; i < numThreads; ++i) {
vectorThreadsFFT.join();
}
关于c++ - 在循环中创建线程 vector 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41063112/