假设我有以下代码段。
// 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);
}
}
我不担心阅读部分。如this答案中所述,看起来
input[i]
的读取是线程安全的。
最佳答案
output[i]
不写入output
。这只是对std::vector<MyObj2>::operator[]
的调用。它返回一个未命名的MyObj2&
,然后将其用于调用generateOutput
。后者是写发生的地方。
我假设generateOutput
本身也是线程安全的,而且MyObj2
也是线程安全的,因为我们没有相应的代码。因此,在MyObj2&
中写入generateOutput
也是线程安全的。
结果,所有部件都是线程安全的。
关于c++ - vector 引用operator []线程安全写吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61469651/