首页 > 解决方案 > c++向量下标超出范围omp锁

问题描述

如果任何线程在该行中添加新值,我想在完整的锁上使用锁。为此,我编写了以下代码:

std::vector <omp_lock_t> ds_lock;

我正在初始化构造函数中的锁

Sparse_Matrix_RL::Sparse_Matrix_RL(unsigned int row_size, unsigned int col_size)
{
    row_sz = row_size;
    col_sz = col_size;
    omp_init_lock(&ds_lock[0]);
}

我在这里使用它

void Sparse_Matrix_RL::addValue(unsigned int rid, unsigned int cid, double value)
{
    omp_set_lock(&ds_lock[rid]);

    if (value == 0) 
    {
        omp_unset_lock(&ds_lock[rid]);
        return;
    }
    std::map<unsigned int, double>::iterator str = data_Matrix[rid].begin();
    std::map<unsigned int, double>::iterator end = data_Matrix[rid].end();
    str = data_Matrix[rid].find(cid);
    //while (str->first != cid && str != end) str++;
    if (str != end)
        str->second += value;
    else
        data_Matrix[rid][cid] = value;
    omp_unset_lock(&ds_lock[rid]);
}

当我运行代码时,它给了我错误:

向量下标超出范围

现在我不明白我错在哪里。

标签: c++openmp

解决方案


您的向量ds_lock中没有任何元素,并且您正在访问Sparse_Matrix_RL以下语句的构造函数中第一个元素的地址。

omp_init_lock(&ds_lock[0]);

您必须使用其中一个resize()push_back()添加元素,然后才尝试访问其元素。


推荐阅读