Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何使用posix信号量实现屏障?_Multithreading_Posix_Semaphore_Barrier - Fatal编程技术网

Multithreading 如何使用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;

如何使用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; 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
开始。然后,我想您可以添加调试输出,以显示每个线程等待之前/之后的状态,并且可能输出将显示您没有预料到的状态,这将是一个线索。