- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我假设我能够创建 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) 尝试中死锁。
难道不能创建两把不同的锁,独立使用吗?如果可能,设置这些锁的正确方法是什么?
谢谢
最佳答案
代码按预期工作。我假设您对 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";
…
这段代码不会死锁。
关于c++ - 我可以在 OpenMP 中使用多个 omp_lock_t 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11037193/
我的目标是将线程对数组的单个元素的访问限制为一次只有一个线程。为此,我使用 OpenMP 锁原语。但是,如果 Num_Items 是动态的并且在代码编译之前未知怎么办?看来 omp_lock_t 只接
# include # include # include #define SIZE 10 #define NUM_THREADS SIZE using namespace std; main(
我假设我能够创建 2 个不同的 omp_lock_t,并彼此独立地锁定它们。我用 gcc 4.4 和 gcc 4.6.1 测试了以下代码部分并得到了相同的输出: omp_lock_t lockA; o
我是一名优秀的程序员,十分优秀!