并发写入 std::vector 到不同的索引会导致崩溃
Concurrent write to std::vector to different indices causes crash?
我有一个大向量,我想更新该向量中的一些数据(没有插入/删除,而是在指定索引上用另一个元素替换一个元素(。
我认为在 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();
}
按值捕获offset
,否则你有悬空的指针。
您的线程从循环内部一直存在,直到连接。
offset
只存在于一个循环迭代中。
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 数组索引的值没有增加
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 内联映射初始化的动态atexit析构函数崩溃
- 执行函数时导致崩溃的变量
- 查找最接近的大于当前数字的数字的索引
- 程序崩溃并显示"std::out_of_range"错误
- 在C++中调整向量中的索引
- 重载元组索引运算符-C++
- CoInitialize()在单独的线程上崩溃而不返回
- 使用调试/崩溃报告将应用程序部署到客户端
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 为std::string的某个索引赋值
- 并行用于C++17中数组索引范围内的循环
- 为什么 std::string 在索引超出范围时不自动追加(或崩溃)?
- 并发写入 std::vector 到不同的索引会导致崩溃
- Eclipse CDT 在尝试索引头文件时崩溃
- 写入索引缓冲区时崩溃
- OpenGL glMultiDrawElements 在索引偏移量上崩溃
- c++析构函数调用数组索引?在非线程安全的refcount对象上崩溃