我目前正在尝试在班级的线程成员函数中完成工作。因此它获取一个2d数组作为参数并在成员函数中填充它。这会重复多次。在产生第一个线程后,我得到一个读取或写入访问冲突的错误。我尝试了不同的方法来解决它,但无法让它发挥作用。虽然我发现这里已经解决了几乎所有问题,但在这种情况下,我现在找不到一段时间是不成功的。
void myClass::process(Vector3D& out_stack, long filterFaktor){
long rowSize = this->input2D.size();
long colSize = this->input2D.at(0).size();
int filterPerRowCount = ceil((double)rowSize / filterFaktor);
int filterPerColCount = ceil((double)colSize / filterFaktor);
std::vector<std::thread> threadPool;
//create new filter
long currentrow = 0;
while (currentrow < rowSize) {
long currentcol = 0;
while (currentcol < colSize) {
Filter* nextFilter = &this->createNextFilter(currentrow, currentcol, filterPerRowCount, filterPerColCount);
out_stack.push_back(Vector2D());
Vector2D* nptr = &out_stack[out_stack.size()-1];
//Here we are calling the thread which leads to the access violation
threadPool.push_back(std::thread(&myClass::nextProcess, this, nextFilter, nptr, rowSize, colSize));
currentcol += filterPerColCount;
}
currentrow += filterPerRowCount;
}
//wait until threads have finished
for (int iThread = 0; iThread < threadPool.size(); iThread++) {
threadPool[iThread].join();
}
}
void myClass::nextProcess(Filter* nextfilter, Vector2D* out_Map, long rowCount, long colCount){
//Loops this part -> creates the rows and pushes them in the out_Map
std::vector<double> nextRowInMap;
//... Calculates sum
nextRowInMap.push_back(sum);
//Push row in vector -> This is where the error occurs
out_Map->push_back(nextRowInMap);
}
typedef std::vector<double> Vector1D;
typedef std::vector<Vector1D> Vector2D;
typedef std::vector<Vector2D> Vector3D;
我认为我只是缺少在C ++中使用指针的知识,因为我是新手。
提前致谢&amp;最好的问候
修改
现在尝试这种方式,仍然无法运作:
out_stack.push_back(Vector2D());
long index = out_stack.size() - 1;
threadPool.push_back(std::thread(&myClass::nextProcess, this, nextFilter, &out_stack, index, rowSize, colSize));
在nextProcess中:
out_stack->at(index).push_back(nextRowInMap);
修改
解决mutex
。另外,我需要传递过滤器而不是参考。
答案 0 :(得分:0)
你的错误在这里:
out_stack.push_back(Vector2D());
Vector2D* nptr = &out_stack[out_stack.size()-1];
修改矢量时,无法保证对象保持在同一地址。
当向量必须增长时,它可以在另一个地址上分配内部存储器,并将向量中的对象移动到新地址。因此指针在下一个push_back
您应该将向量和索引传递给线程并在每次需要时访问它
out_stack[index].push_back(...)
可能是在out_stack[index]
之后和push_back
之前,矢量被修改,您也在无效的内存上运行。因此,您应该使用std::mutex
保护访问/修改向量。虽然如果有一些我不知道的线程安全保证,我不确定最后一部分。