векторный индекс c ++ вне диапазона блокировок omp - PullRequest
0 голосов
/ 20 декабря 2018

Я хочу использовать блокировку полной блокировки, если какой-либо поток добавляет новое значение в эту строку.Для этого я должен написать следующий код:

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]);
}

КогдаЯ запускаю код, который выдает мне ошибку:

векторный индекс вне диапазона

Теперь я не понимаю, где я ошибаюсь.

1 Ответ

0 голосов
/ 20 декабря 2018

Ваш вектор ds_lock не содержит никаких элементов, и вы обращаетесь к адресу первого элемента в конструкторе Sparse_Matrix_RL в приведенном ниже выражении.

omp_init_lock(&ds_lock[0]);

Вы должны использоватьлибо resize(), либо push_back() для добавления элементов и только затем попытайтесь получить доступ к его элементам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...