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

   }

所以我对互斥体有一些疑问。我确信在进入函数时。enterBarrier 我必须锁定互斥体,这样就没有其他线程得到它并改变它,同时“等待”!但是我解锁了互斥锁和代码的结尾,由于锁定的互斥锁,我不确定其他线程是否会进入 enterBarrier。

我不完全确定这个互斥锁是如何工作的。

4

1 回答 1

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

}

于 2016-03-12T10:05:57.770 回答