Является ли этот код потокобезопасным?

 
0
 
C++
ava
W4FhLF | 22.01.2013, 23:19
Привет!

Собственно упрощённый код:


std::vector<double> vals(nvals);
long idx = 0;

#pragma omp parallel for
    for(int i = 0; i <= nx; ++i)
    {
        for(int j = 0; j <= ny; ++j)
        {
            double v;
            ...
            InterlockedIncrement(&idx);
            vals[idx - 1] = v;
        }
    }


Если нет, то почему?
Если да, то почему-то результаты зависят от кол-ва потоков...
Kommentare (3)
ava
volatile | 22.01.2013, 23:30 #
Цитата (W4FhLF @  22.1.2013,  22:19 findReferencedText)
Если нет, то почему? 

Хотя бы потому, что
Цитата (W4FhLF @  22.1.2013,  22:19 findReferencedText)
std::vector<double> vals(nvals);

long idx = 0;

#pragma omp parallel for
  for(int i = 0; i <= nx; ++i)
  {
    for(int j = 0; j <= ny; ++j)
    {
    double v;
    ...
    InterlockedIncrement(&idx);
    //---------------------------- Вот здесь idx может изменить другой поток.
    vals[idx - 1] = v;
    }
  }


Уж как минимум нужно так:

            long t = InterlockedIncrement(&idx);
            vals[t - 1] = v;


что конечно еще не гарантирует потокобезопасность. сам std::vector не потокобезопасен.
если в потоках происходит изменение размера вектора, то вообще работать не будет.
и еще много других причин....
нужно смотреть весь код.
ava
W4FhLF | 23.01.2013, 20:26 #
Цитата (volatile @  22.1.2013,  23:30 findReferencedText)
Уж как минимум нужно так:


Вот это кажется в точку.

Цитата (volatile @  22.1.2013,  23:30 findReferencedText)
что конечно еще не гарантирует потокобезопасность. сам std::vector не потокобезопасен.

если в потоках происходит изменение размера вектора, то вообще работать не будет.

и еще много других причин....


Я забыл упомянуть, что размер вектора не меняется и каждый элемент адресуется только единожды. 
ava
volatile | 23.01.2013, 23:14 #
Цитата (W4FhLF @  23.1.2013,  20:26 findReferencedText)
размер вектора не меняется и каждый элемент адресуется только единожды

В таком случае все должно быть норм.
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden