OpenMP и STL вектор - PullRequest
       36

OpenMP и STL вектор

16 голосов
/ 14 февраля 2012

У меня есть код, для которого я хотел бы использовать OpenMP следующим образом:

std::vector<int> v(1000);
# pragma omp parallel for
for (int i = 0; i < 1000; ++i) {
    v[i] = i;
}

Я прочитал, что векторный контейнер STL не является потокобезопасным в ситуации, когда несколько потоковзапись в один контейнер, что подразумевало бы, что мне нужно заблокировать вектор перед выполнением любых записей;тем не менее, мне также сказали, что операция записи выше как бы «атомарна», и поэтому выше условия гонки отсутствуют.Может ли кто-нибудь уточнить это?

Ответы [ 2 ]

26 голосов
/ 14 февраля 2012

В этом конкретном примере это будет безопасно.

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

Обратите внимание, что вы можете сделать это легально:

std::vector<int> v(1000);
int *ptr = &v[0];

# pragma omp parallel for
for (int i = 0; i < 1000; ++i) {
    ptr[i] = i;
}

Когда вы начинаете вызывать, он становится не поточнобезопаснымтакие методы, как push_back(), pop_back(), insert() и т. д. из нескольких потоков.

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

0 голосов
/ 14 февраля 2012

Многократное чтение безопасно, но я бы рекомендовал избегать многократных записей в один и тот же контейнер.Но вы можете написать в память, которой вы управляете самостоятельно.Разница с вектором заключается в том, что вы можете быть уверены, что память не будет изменена или перераспределена одновременно.В противном случае вы также можете использовать семафор, но это, вероятно, снизит эффективность, а если вы используете несколько, это может даже вызвать взаимные блокировки, если вы не будете работать должным образом.

...