2016-03-08 62 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); 

}