Pun*_*han 4 c c++ parallel-processing multithreading openmp
我无法弄清楚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);
Run Code Online (Sandbox Code Playgroud)
嵌套锁可以多次锁定.它会解锁,直到您将其设置为调用次数的次数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);
}
Run Code Online (Sandbox Code Playgroud)
现在,如果您使用简单的锁,这将不起作用,因为不允许多次设置/取消设置锁,并且我们无法保证"添加"是以原子方式完成的 - 因此两个线程可能会ll以相同的方式更新价值立刻.
(上面的代码是为了说明情况而写的,不一定是"好的代码").