c++ - 向量引用运算符 [] 是否可以编写线程安全?
问题描述
假设我有以下代码片段。
// 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]
是线程安全的。
解决方案
output[i]
不写信给output
. 这只是对std::vector<MyObj2>::operator[]
. 它返回一个未命名的MyObj2&
,然后用于调用generateOutput
。后者是写入发生的地方。
我会假设它generateOutput
本身也是线程安全的MyObj2
,因为我们没有代码。所以写入MyObj2&
内部generateOutput
也是线程安全的。
因此,所有部分都是线程安全的。
推荐阅读
- postman - 有没有办法在 Postman 中运行中间迭代
- docker - Tensorflow-Serving - ML 模型中的时间测量
- html - CSS - 文本滑动动画
- ios - 为什么SVProgressHUD会抛出eorrr?
- python - 如何根据Python中的字符数拆分文本文件
- reactjs - 如何测试是否调用了useState或单击了按钮?
- flutter - 如何将创建的 pdf 共享到 whatsapp 到特定号码?尝试了所有不起作用的软件包..我只能发送文本
- python - Python实时边缘检测 - 从每一帧中获取白色像素的数量
- javascript - 无法设置角度异步验证器
- nlp - len(tokenizer) 和 tokenizer.vocab_size 有什么区别