2014-03-07 43 views
2

我無法弄清楚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); 
+0

我會建議讓鎖定靜態,以便它會檢查鎖定條件,然後進入循環。我希望它能幫助你。 –

回答

3

嵌套鎖可以鎖定多次。除非您撥打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具有相同的值。

(上面的代碼是爲了說明情況,不一定是「好代碼」)。