UNIX 屏障(barrier)的一個可能的簡單實現(使用條件變數)
阿新 • • 發佈:2018-11-29
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; }
如有錯誤,肯請指正,不慎感激!