Допустим, у меня есть следующий фрагмент кода.
// Some function decleration
void generateOutput(const MyObj1& in, MyObj2& out);
void doTask(const std::vector<MyObj1>& input, std::vector<MyObj2>& output) {
output.resize(input.size());
// Use OpenMP to run in parallel
#pragma omp parallel for
for (size_t i = 0; i < input.size(); ++i) {
generateOutput(input[i], output[i]);
}
}
Является ли вышеуказанный код безопасным? Я в основном озабочен тем, чтобы писать на output[i]
Нужна ли какая-то блокировка? Или это не нужно? Например:
// Some function prototype
void generateOutput(const MyObj1& in, MyObj2& out);
void doTask(const std::vector<MyObj1>& input, std::vector<MyObj2>& output) {
output.resize(input.size());
// Use OpenMP to run in parallel
#pragma omp parallel for
for (size_t i = 0; i < input.size(); ++i) {
MyObj2 tmpOutput;
generateOutput(input[i], tmpOutput);
#pragma omp critical
output[i] = std::move(tmpOutput);
}
}
Я не беспокоюсь о части чтения. Как упомянуто в этом ответе, похоже, что чтение input[i]
является потокобезопасным.