嵌套锁和简单锁之间的区别(Difference between nested locks and simple locks)

编程入门 行业动态 更新时间:2024-10-27 06:24:53
嵌套锁和简单锁之间的区别(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 %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);

i am unable to figure out the difference between omp_nest_lock_t and omp_lock_t lck; this code perfectly synchronizes the longtask(), but on execution unable to figure out the difference between them;

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);

最满意答案

嵌套锁可以多次锁定。 在您将其设置为与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同一价值。

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

A nested lock can be locked several times. It doesn't unlock until you have unset it as many times as the number of calls to omp_set_nest_lock.

A simple lock should only be omp_set_lock once, and unlocks on one call to omp_unset_lock.

The purpose of having nested locks is that you can have functions that call other functions using the same lock. E.g.

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); }

Now, this wouldn't work if you used simple locks, because setting/unsetting the lock more than once is not allowed, and we couldn't guarantee that the "add" is done atomically - thus two threads could potentially update ll with the same value at once.

(The code above is written to illustrate the situation, not necessarily as "good code").

更多推荐

本文发布于:2023-08-04 23:47:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1423273.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:嵌套   区别   简单   Difference   locks

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!