c++ - 在循环中创建线程 vector 的问题

标签 c++ multithreading c++11 vector segmentation-fault

我正在尝试在循环内创建不同的线程并将它们存储在线程 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_backpush_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/

相关文章:

c++ - 为什么 "constructor invocation"不触发任何编译器 (g++) 警告?

c++ - 如何创建接受参数的dll

java - 同时读取数组线程安全吗?

c++ - 返回模板类的模板函数 - gcc 编译问题 - 错误 : expected unqualified-id before '<' token

c# - .Net 4 中的多线程 C# 队列

java多线程用于任务之间的同步

c++ - g++ 错误 : specialization after instantiation (template class as friend)

c++ - 模板难题

c++ - 发送的参数与函数 def 不匹配

c++ - Visual Studio C++ : what's creating these threads?