UNIX 屏障(barrier)的一个可能的简单实现(使用条件变量)
typedef struct {
pthread_cond_t cond;
pthread_mutex_t mutex;
unsigned int count;
}mpthread_barrier_t;
int mpthread_barrier_init(mpthread_barrier_t *restrict barrier, unsigned int count) {
if (barrier != NULL) {
pthread_mutex_init(&barrier->mutex, NULL);
pthread_cond_init(&barrier->cond, NULL);
barrier->count = count;
}
return 0;
}
int mpthread_barrier_wait(mpthread_barrier_t *restrict barrier) {
pthread_mutex_lock(&barrier->mutex);
if (barrier->count <= 1) {
if(barrier->count == 1)
barrier->count--;
pthread_mutex_unlock(&barrier->mutex);
pthread_cond_broadcast(&barrier->cond);
return 0;
}
barrier->count--;
while (barrier->count != 0)
pthread_cond_wait(&barrier->cond, &barrier->mutex);
pthread_mutex_unlock(&barrier->mutex);
return 0;
}
示例运行:(使用50个线程置一初始值为0的含50个整形元素的数组为全1)
int arr[TNUM] = {0};
mpthread_barrier_t b;
void *thr_fn(void *arg) {
int idx = (int)((long)arg);
// sleep(1);
arr[idx] = 1;
mpthread_barrier_wait(&b);
}
int main() {
mpthread_barrier_init(&b, TNUM + 1);
for (long i = 0; i < TNUM; i++) {
pthread_t tid;
int err = pthread_create(&tid, NULL, thr_fn, (void*)(i));
if (err != 0)
err_exit(err, "can't create thread");
}
mpthread_barrier_wait(&b); /* 等待直到barrier->count 为0,表明所有50个线程已完成工作 */
for(int i = 0; i < TNUM; i++)
printf("%d ", arr[i]);
putchar(10);
return 0;
}
如有错误,肯请指正,不慎感激!