我假设我能够创建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)尝试上死锁。
是否无法创建两个不同的锁并单独使用它们?如果可能,设置这些锁的正确方法是什么?
由于
答案 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";
…
此代码不会死锁。