C++ 向不同索引并发写入std::vector会导致崩溃吗?

C++ 向不同索引并发写入std::vector会导致崩溃吗?,c++,vector,concurrency,mutex,C++,Vector,Concurrency,Mutex,我有一个大的向量,我想更新该向量中的一些数据(没有插入/删除,而是用指定索引上的另一个元素替换一个元素) 我认为在2个或更多不同的线程上进行工作是非常聪明的,因此可以提高速度。由于在这种情况下不需要同步,由于不同的索引,这应该非常快 不幸的是,我的代码崩溃了,要么声明:EXC_BAD_ACCESS,要么声明“未分配被释放的指针” 伪代码: // I have an entries_ vector with data of type DataT std::vector<std::threa

我有一个大的向量,我想更新该向量中的一些数据(没有插入/删除,而是用指定索引上的另一个元素替换一个元素)

我认为在2个或更多不同的线程上进行工作是非常聪明的,因此可以提高速度。由于在这种情况下不需要同步,由于不同的索引,这应该非常快

不幸的是,我的代码崩溃了,要么声明:EXC_BAD_ACCESS,要么声明“未分配被释放的指针”

伪代码:

// I have an entries_ vector with data of type DataT

std::vector<std::thread> workers(NUMBER_OF_PARALLEL_CHUNKS);

unsigned long tuplesPerChunk = entries_.size() / NUMBER_OF_PARALLEL_CHUNKS;

for (int j = 0; j < NUMBER_OF_PARALLEL_CHUNKS; ++j) {
    unsigned long offset = tuplesPerChunk * j;

    workers.emplace_back(std::thread([&offset, &tuplesPerChunk, this](){
        for (int i = 0; i < tuplesPerChunk; ++i) {
            unsigned long offsetIndex = offset + i;
            entries_[offsetIndex] = createNewDataForSomeParticularReason();

        }
    }));
}

for (auto &worker : workers) {
    if (worker.joinable()) worker.join();
}
//我有一个带有DataT类型数据的entries\uu向量
向量工作者(并行块的数量);
unsigned long tuplesPerChunk=条目\uu.size()/并行块的数量\u;
for(int j=0;j<并行块的数量;++j){
无符号长偏移量=tuplesPerChunk*j;
workers.emplace_back(std::thread([&offset,&tuplesPerChunk,this])(){
对于(int i=0;i
按值捕获
偏移量
,否则指针将悬空

您的线程从循环内部生存,直到连接


offset
仅存在于一个循环迭代中。

按值捕获
offset
,否则指针将悬空

您的线程从循环内部生存,直到连接


offset
仅存在于一个循环迭代中。

这是可行的,但您能详细说明一下吗?准确地说,
offset
存在于一个循环迭代中。每个迭代都有自己的
偏移量
,一旦迭代结束就会消失。@RustyX捕捉得好!虽然从技术上讲这是未定义的行为,但实际上
offset
的存储很可能会被重用,这意味着在循环运行时,来自过去迭代的线程将读取
offset
的当前值,从而引入竞争条件,但你能详细说明一下吗?准确地说,
offset
存在于一个循环迭代中。每个迭代都有自己的
偏移量
,一旦迭代结束就会消失。@RustyX捕捉得好!虽然这在技术上是未定义的行为,但实际上
offset
的存储很可能会被重用,这意味着在循环运行时,来自过去迭代的线程将读取
offset
的当前值,从而引入竞争条件。如果没有更多信息,很难回答这个问题。错误发生在代码中的什么地方?你有没有试着找出发生的原因?它只发生在一个线程上吗?只包含一个条目的数组?等等。你能使代码更简单并且仍然显示相同的问题吗?(这样做,你可能会发现哪里出了问题。)没有更多信息,很难回答这个问题。错误发生在代码中的什么地方?你有没有试着找出发生的原因?它只发生在一个线程上吗?只包含一个条目的数组?等等。你能使代码更简单并且仍然显示相同的问题吗?(这样做,您可能会发现哪里出了问题。)