Я прочитал qaru.site/info/177928/..., что ни один из контейнеров STL не является потокобезопасным для записи. Но что это значит на практике? Означает ли это, что я должен хранить записываемые данные в простых массивах?
Я ожидаю, что одновременные вызовы std::vector::push_back(element)
могут привести к несогласованным структурам данных, потому что это может повлечь изменение размера вектора. Но как насчет такого случая, когда изменение размера не задействовано:
1), используя массив:
int data[n];
// initialize values here...
#pragma omp parallel for
for (int i = 0; i < n; ++i) {
data[i] += func(i);
}
2) с помощью ` std::vector` `:
std::vector<int> data;
data.resize(n);
// initialize values here...
#pragma omp parallel for
for (int i = 0; i < n; ++i) {
data[i] += func(i);
}
Является ли первая реализация действительно лучше, чем вторая, а) с точки зрения безопасности потоков и б) с точки зрения производительности? Я бы предпочел использовать std::vector, так как я менее удобен для массивов в стиле C.
EDIT: я удалил #pragma omp atomic update
, защищающий запись.