【问题标题】:Difference between nested locks and simple locks嵌套锁和简单锁的区别
【发布时间】:2014-04-10 06:41:48
【问题描述】:

我无法弄清楚 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 %d\n",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);

【问题讨论】:

  • 我建议将锁设为静态,以便检查锁定条件,然后进入循环。希望对你有帮助。

标签: c++ c multithreading parallel-processing openmp


【解决方案1】:

嵌套锁可以被多次锁定。直到您取消设置的次数与调用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 一次具有相同的值。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-12
    • 2011-04-13
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 2012-08-03
    • 2011-08-28
    • 1970-01-01
    相关资源
    最近更新 更多