【发布时间】:2016-12-09 14:54:21
【问题描述】:
我正在尝试在循环中创建不同的线程并将它们存储在线程向量中。
EDIT 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 子句并将emplace_back() 更改为push_back(),但我仍然得到相同的结果。
编辑 3:当我只为另一个函数创建一个线程时,它有时(但不是每次)仍然崩溃,例如:
thread th2{separator, ref(vectorBuffersUC), ref(numThreads), ref(nitems)};
下面是哪个标头:
void separator(vector<unique_ptr<lockedBufferUC>> &vectorBuffersUC, int numThreads, const long nitems){}
我开始怀疑这是因为我提供给向量的参数以及函数如何接收它们。
我是否缺少有关 C++11 和线程管理的内容?
请随时询问更多详细信息或代码。
已尝试的解决方案:
- 预留空间
- 按值传递 i 的引用
【问题讨论】:
-
如果你只是创建例如它是否有效?十个线程不在一个向量中?只是想找出问题所在。
-
@KennyOstrom 不,我刚刚尝试创建三个线程,但它在第一个线程上中止。
-
好的。所以这与“线程向量”无关,与“创建线程”有关。那么它如何崩溃了?如果只调用线程函数,它会运行吗?
-
另外,
vector<thread> vectorThreadsFFT{(unsigned long) (numThreads)}创建了一个带有numThreads元素的向量——所有这些元素都不对应于线程。emplace_back(或push_back)然后创建另一个元素。你需要的是vector<thread> vectorThreadsFFT;,或者如果你真的坚持,vector<thread> vectorThreadsFFT; vectorThreadsFFT.reserve(numThreads); -
@danielsto:因为这就是
emplace_back存在的全部原因——你传入构造函数参数,它调用构造函数以便在向量中就地构造对象。
标签: c++ multithreading c++11 vector segmentation-fault