我可以在OpenMP中使用多个omp_lock_t吗?

时间:2012-06-14 16:16:00

标签: c++ gcc parallel-processing openmp

我假设我能够创建2个不同的omp_lock_t,并将它们彼此独立锁定。我用gcc 4.4和gcc 4.6.1测试了下面的代码部分,得到了相同的输出:

omp_lock_t lockA;
omp_lock_t lockB;
omp_init_lock(&lockA);
omp_init_lock(&lockB);

std::cout << "Lock B is: " omp_test_lock(&lockB) << "\n";
omp_set_lock(&lockA);
std::cout << "Lock A set\n";
std::cout << "Lock B is: " omp_test_lock(&lockB) << "\n";

omp_set_lock(&lockB);
...

此代码生成以下输出:

Lock B is: 1
Lock A set
Lock B is: 0

然后它在omp_set_lock(&amp; lockB)尝试上死锁。

是否无法创建两个不同的锁并单独使用它们?如果可能,设置这些锁的正确方法是什么?

由于

1 个答案:

答案 0 :(得分:3)

代码按预期工作。我假设你对omp_test_lock所做的事情有误解(特别是因为这个名字肯定是非常误导的。)

omp_test_lock 尝试获取锁。但除非omp_set_lock,否则在成功获取锁之前不会阻塞。但这是唯一的区别。值得注意的是,在第一次“测试”(不仅仅是测试)之后,获得了lockB,这就是第二次“测试”失败的原因,以及后续omp_set_lock(&lockB)死锁的原因。

只是为了明确这一点:是的,你可以使用多个锁。

omp_lock_t lockA;
omp_lock_t lockB;
omp_init_lock(&lockA);
omp_init_lock(&lockB);

omp_set_lock(&lockA);
std::cout << "Lock A set\n";
omp_set_lock(&lockB);
std::cout << "Lock B set\n";
…

此代码不会死锁。