我有一个大向量,我想更新该向量中的一些数据(没有插入/删除,而是在指定的索引上用另一个替换元素)。
我认为在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();
}
答案 0 :(得分:6)
按值捕获body
,否则你有悬空指针。
你的线程从循环内部开始直到连接。
offset
只存在于一个循环迭代中。