【发布时间】:2021-05-12 19:52:28
【问题描述】:
让我们考虑一些代码来安全地在具有多个线程的 for 循环中递增变量。
要实现这一点,您必须在增加变量时使用某种锁定机制。 当我在寻找解决方案时,我想出了以下解决方案。
我的问题是:
- 它们是否同样好,或者其中一个有一些后备?
- 何时使用
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;
}
【问题讨论】:
-
原则上,如果一个坏的想法,混合两个不同的并行模型。因此,如果您使用 OpenMP 并行性,请避免使用 C++ 之一,因为两者之间的交互可能会出乎意料。现在,就是说,你想达到什么目的?因为根据您想对
someVar执行的操作,可能会有更好的方法来增加它。
标签: c++ multithreading performance openmp mutex