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

den*_*631 0 c++ concurrency mutex vector

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

我认为这对于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();
}
Run Code Online (Sandbox Code Playgroud)

Jar*_*d42 6

offset按值捕获,否则你有悬空指针.

你的线程从循环内部生效直到连接.

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

  • 确切地说,'offset`存在于一个循环*迭代*中.每次迭代都有自己的`offset`,一旦迭代结束,它就会消失. (3认同)