嵌套锁和简单锁之间的区别
Difference between nested locks and simple locks
我无法弄清OMP_NEST_LOCK_T和OMP_LOCK_T LCK之间的区别;此代码完美地同步了longtask(),但是执行后无法弄清楚它们之间的区别;
omp_nest_lock_t lck_n; //omp_lock_t lck;
int t_id;
omp_init_nest_lock(&lck_n); //omp_init_lock(&lck);
omp_set_num_threads(6);
#pragma omp parallel private(t_id) shared(lck_n)
{
t_id = omp_get_thread_num();
omp_set_nest_lock(&lck_n); //omp_set_lock(&lck);
printf("nhi by %dn",t_id);
long_task();
printf("My thread id is %d.n", id);
omp_unset_nest_lock(&lck_n); //omp_unset_lock(&lck);
}
omp_destroy_nest_lock(&lck_n); //omp_destroy_lock(&lck);
嵌套锁可以锁定几次。直到您将其设置为omp_set_nest_lock
的电话数量多次,它才能解锁。
一个简单的锁应仅是omp_set_lock
一次,并在一个呼叫omp_unset_lock
时解锁。
嵌套锁的目的是您可以使用相同的锁来调用其他功能的功能。例如。
class object { int number; ... }
linked_list<object&> ll;
omp_nest_lock_t ll_lock;
void add_to_linked_list(object& o)
{
omp_set_nest_lock(ll_lock);
ll.push_back(o);
omp_unset_nest_lock(ll_lock);
}
void increement_or_add(object& o)
{
omp_set_nest_lock(ll_lock);
if (ll.find(o))
o.number++;
else
add_to_linked_list(o);
omp_unset_nest_lock(ll_lock);
}
现在,如果您使用了简单的锁,这将行不通,因为不允许设置/解开锁定,我们不能保证"添加"是原子上完成的 - 因此,两个线程可能可能会更新ll
立即具有相同的值。
(上面的代码是为了说明情况,而不一定为"好代码")。
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 这 4 个 lambda 表达式之间有什么区别?
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- (double) 和 double() 之间的区别
- & 和 * 之间的区别
- std::is_convertible 和 std::convertible_to 之间的区别(在实践中)?
- 析构函数和'delete'之间的区别
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- OpenMP #pragma omp for v/s #pragma omp parallel for 之间的区别?
- S() 与 S{} 之间的区别?