嵌套锁和简单锁之间的区别

Difference between nested locks and simple locks

本文关键字:区别 之间 简单 嵌套      更新时间:2023-10-16

我无法弄清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立即具有相同的值。

(上面的代码是为了说明情况,而不一定为"好代码")。