并发写入 std::vector 到不同的索引会导致崩溃?

Concurrent write to std::vector to different indices causes crash?

我有一个大向量,我想更新该向量中的一些数据(不是 insert/delete,而是用指定索引上的另一个元素替换一个元素)。

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

不幸的是,我的代码崩溃了,要么是声明:EXC_BAD_ACCESS,要么是 "pointer being freed was not allocated"。

伪代码:

// 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();
}

按值捕获 offset,否则你有悬挂指针。

您的线程在循环内一直存在,直到加入。

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