【问题标题】:Can I use multiple omp_lock_t's in OpenMP?我可以在 OpenMP 中使用多个 omp_lock_t 吗?
【发布时间】:2012-06-14 16:15:59
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: c++ gcc parallel-processing openmp


    【解决方案1】:

    代码按预期工作。我假设您对 omp_test_lock 的作用存在误解(尤其是因为这个名称确实具有误导性)。

    omp_test_lock 试图获取锁。但除非omp_set_lock,否则它不会阻塞,直到它成功获得锁。但这是唯一的区别。值得注意的是,在第一个“测试”(不仅仅是一个测试)之后,lockB 被获取,这就是为什么第二个“测试”失败,以及随后的omp_set_lock(&amp;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-04-09
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      • 2015-03-06
      • 1970-01-01
      相关资源
      最近更新 更多