2

我假设我能够创建 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(&lockB) 尝试中死锁。

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

谢谢

4

1 回答 1

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";
…

这段代码不会死锁。

于 2012-06-14T16:21:51.667 回答