2016-03-08 88 views
-1

我想要實現的線程線程屏障同步

到目前爲止,我想出了一些代碼屏障同步技術,但我有一些問題..

struct _ThreadBarrier { 

    pthread_cond_t cond; 
    int needed; 
    int waiting; 
    int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex); 
    pthread_mutex_t mut; 
} 


some other code for initilization etc .. 




void enterBarrier(ThreadBarrier *barrier) { 
    pthread_mutex_lock(&barrier->mut); 


    waiting ++; 
    if (waiting == needed){ 

      barrier->cond = 1; 
      barrier->waiting = 0; 
      pthread_cond_broadcast(&barrier->cond); 


    }else{ 
      barrier->cond = 0; 
      pthread_cond_wait&barrier->cond,&barrier->mut); 
    } 



    pthread_mutex_unlock(&barrier->mult); 

    } 

所以我有一些對互斥體的追求。我相信在進入func時。 enterBarrier我必須鎖定互斥鎖,以便其他線程無法獲取它並更改,同時「等待」!但是我解開了互斥鎖和代碼的結尾,我不確定是否有其他線程會進入enterBarrier,因爲互斥鎖被鎖定了。

我不完全確定這個互斥量究竟是如何工作的。

+2

人們認爲問#2的問題,預計前手做基礎研究。你的問題不是關於你顯示的代碼,而是關於一般的互斥體。你應該能夠在網上找到很多有關這方面的信息。開始花時間閱讀[pthread手冊頁](http://linux.die.net/man/3/pthread_mutex_lock),如果能夠理解,將會回答你的問題。 – kaylum

+0

[如果互斥量已經被鎖定,調用線程將阻塞,直到互斥量變爲可用。](http://linux.die.net/man/3/pthread_mutex_lock) – LPs

+0

是的,我閱讀man頁面:)但它是我不清楚這就是爲什麼我問這個問題......所以我在這裏實施的鎖是有效的,並且不會按預期工作?它應該如何?感謝您的時間 – Mladia

回答

1

下面是它應該如何。要鎖定/解鎖條件變量,需要使用函數。互斥鎖應鎖定在一開始

void enterBarrier(ThreadBarrier *barrier) { 
pthread_mutex_lock(&barrier->mut); 


barrier->waiting ++; 

if (barrier->waiting == barrier->needed){ 

    barrier->waiting = 0; 
    pthread_cond_broadcast(&barrier->cond); 

}else{ 
    pthread_cond_wait(&barrier->cond,&barrier->mut); 

} 

pthread_mutex_unlock(&barrier->mut); 

}