c++ - std::lock_guard 和 #pragma omp critical 之间的区别
问题描述
让我们考虑一些代码来安全地在具有多个线程的for循环中递增变量。
为了实现这一点,您必须在增加变量时使用某种锁定机制。当我在寻找解决方案时,我想出了以下解决方案。
我的问题是:
- 它们同样好还是其中一个有一些后备?
- 何时使用 a
mutex
而不是#pragma omp critical
?
#include <iostream>
#include <mutex>
int main(int argc, char** argv)
{
int someVar = 0;
std::mutex someVar_mutex;
#pragma omp parallel for
for (int i = 0; i < 1000; i++)
{
std::lock_guard<std::mutex> lock(someVar_mutex);
++someVar;
}
std::cout << someVar << std::endl;
return 0;
}
#include <iostream>
int main(int argc, char** argv)
{
int someVar = 0;
#pragma omp parallel for
for (int i = 0; i < 1000; i++)
{
#pragma omp critical
++someVar;
}
std::cout << someVar << std::endl;
return 0;
}
解决方案
推荐阅读
- ethereum - 如何从 Hardhat 部署到以太坊主网?
- python - 如何用 pandas 和 plotly 绘制每日值的频率?
- javascript - flex with textinput 在我的反应本机应用程序中不起作用
- javascript - 布尔值未在 sessionStorage 中正确保存
- c# - Entity Framework Core 5:保存使用 Add(oldItem) 和 db.Entry(oldItem).State = EntityState.Modified 的区别?
- django - Django admin:每个应用都有不同的自定义 base_site.html
- html - HTML,对齐文件浏览器和提交按钮
- python - 模板中未显示帖子视图数(基于函数的视图)
- git - 如何重新定位到其他分支?
- javascript - “expo start”或“npm start”命令卡在“正在启动 Metro bundler”