我想在线程
上实现屏障同步技术到目前为止,我已经提出了一些代码,但我有一些问题......
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,因为锁定的互斥锁。
我不完全确定这个互斥锁是如何工作的。
答案 0 :(得分: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);
}