Multithreading 如何使用posix信号量实现屏障?
如何使用posix信号量实现屏障Multithreading 如何使用posix信号量实现屏障?,multithreading,posix,semaphore,barrier,Multithreading,Posix,Semaphore,Barrier,如何使用posix信号量实现屏障 void my_barrier_init(int a){ int i; bar.number = a; bar.counter = 0; bar.arr = (sem_t*) malloc(sizeof(sem_t)*bar.number); bar.cont = (sem_t*) malloc(sizeof(sem_t)*bar.number); for(i = 0; i < bar.number;
void my_barrier_init(int a){
int i;
bar.number = a;
bar.counter = 0;
bar.arr = (sem_t*) malloc(sizeof(sem_t)*bar.number);
bar.cont = (sem_t*) malloc(sizeof(sem_t)*bar.number);
for(i = 0; i < bar.number; i++){
sem_init(&bar.arr[i], 0, 0);
sem_init(&bar.cont[i], 0, 0); }
}
void my_barrier_wait(){
int i;
bar.counter++;
if(bar.number == bar.counter){
for(i = 0; i < bar.number-1; i++){ sem_wait(&bar.arr[i]); }
for(i = 0; i < bar.number-1; i++){ sem_post(&bar.cont[i]); }
bar.counter = 0;
}else{
sem_post(&bar.arr[pthread_self()-2]);
sem_wait(&bar.cont[pthread_self()-2]);
}
}
void my_barrier_init(int a){
int i;
条数=a;
bar.counter=0;
bar.arr=(sem_t*)malloc(sizeof(sem_t)*棒材编号);
棒材数量=(sem_t*)malloc(sizeof(sem_t)*棒材数量);
对于(i=0;i
调用函数my_barrier_wait时,首先(N-1)次它将为数组“arr”中的信号量设置(+1)并进入睡眠状态(调用sem_wait)。它第N次递减'arr'中的信号量,并且应该(正如我预期的)唤醒[0..bar.number-1]线程,为'cont'数组中的信号量发布+1。它不像屏障那样工作。你需要看看艾伦·唐尼的《信号灯小书》(PDF)。特别是第3.6.7节。它是用Python编写的,但要点应该足够清楚。pthread_self()-2的含义是什么?从
pthread\u self()
返回的值是不透明标识符。你怎么知道可以从中减去2并将其用作数组索引呢?我有一个主线程,它创建了N个子线程,它们的ID是2,3,…(N+1),映射到信号量数组,我从pthread_self()
的手册页中将索引移位(-2):“线程标识符应该被认为是不透明的。”不,它没有。但你还没有真正说出哪里出了问题(只是“它不像屏障那样工作”),所以很难猜测问题出在哪里。也许bar.counter
需要使用互斥锁来防止并发更新?好吧,乍一看它看起来没问题,只是bar.counter
不受多线程同时修改的保护。我可能遗漏了其他东西(并行算法很难解释),但您应该从bar.counter
开始。然后,我想您可以添加调试输出,以显示每个线程等待之前/之后的状态,并且可能输出将显示您没有预料到的状态,这将是一个线索。