Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Является ли этот код потокобезопасным?


Автор: W4FhLF 22.1.2013, 22: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;
        }
    }


Если нет, то почему? 
Если да, то почему-то результаты зависят от кол-ва потоков...

Автор: volatile 22.1.2013, 23:30
Цитата(W4FhLF @  22.1.2013,  22:19 Найти цитируемый пост)
Если нет, то почему? 

Хотя бы потому, что
Цитата(W4FhLF @  22.1.2013,  22: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);
            //---------------------------- Вот здесь idx может изменить другой поток.
            vals[idx - 1] = v;
        }
    }


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

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


что конечно еще не гарантирует потокобезопасность. сам std::vector не потокобезопасен.
если в потоках происходит изменение размера вектора, то вообще работать не будет.
и еще много других причин....
нужно смотреть весь код.

Автор: W4FhLF 23.1.2013, 20:26
Цитата(volatile @  22.1.2013,  23:30 Найти цитируемый пост)
Уж как минимум нужно так:


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

Цитата(volatile @  22.1.2013,  23:30 Найти цитируемый пост)
что конечно еще не гарантирует потокобезопасность. сам std::vector не потокобезопасен.
если в потоках происходит изменение размера вектора, то вообще работать не будет.
и еще много других причин....


Я забыл упомянуть, что размер вектора не меняется и каждый элемент адресуется только единожды. 

Автор: volatile 23.1.2013, 23:14
Цитата(W4FhLF @  23.1.2013,  20:26 Найти цитируемый пост)
размер вектора не меняется и каждый элемент адресуется только единожды

В таком случае все должно быть норм.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)