使用信号量实现barrier
时间: 2023-07-11 14:20:25 浏览: 90
信号量的使用
4星 · 用户满意度95%
可以使用信号量来实现一个 barrier,使得多个线程在特定的时刻汇合并进行下一步操作。下面是一个简单的示例代码:
```c
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#define N_THREADS 5
sem_t mutex, barrier;
void *thread_func(void *arg) {
int id = *(int *)arg;
printf("Thread %d is ready.\n", id);
sem_wait(&mutex);
sem_post(&mutex);
if(sem_post(&barrier) == N_THREADS - 1) {
// All threads have reached the barrier.
printf("All threads have reached the barrier.\n");
sem_post(&barrier);
}
sem_wait(&barrier);
sem_post(&barrier);
printf("Thread %d is done.\n", id);
return NULL;
}
int main() {
pthread_t threads[N_THREADS];
int thread_ids[N_THREADS];
sem_init(&mutex, 0, 1);
sem_init(&barrier, 0, 0);
for(int i = 0; i < N_THREADS; i++) {
thread_ids[i] = i;
pthread_create(&threads[i], NULL, thread_func, &thread_ids[i]);
}
for(int i = 0; i < N_THREADS; i++) {
pthread_join(threads[i], NULL);
}
sem_destroy(&mutex);
sem_destroy(&barrier);
return 0;
}
```
在这个代码中,我们定义了两个信号量 `mutex` 和 `barrier`。`mutex` 用来保护 `barrier` 的计数器,防止多个线程同时修改它。`barrier` 的初始值为 0,表示没有线程到达 barrier。每个线程会先调用 `sem_wait(&mutex)` 来获取 `mutex` 的锁,然后立即释放锁,以允许其他线程获取锁。然后它会调用 `sem_post(&barrier)` 来增加 `barrier` 的计数器。如果计数器的值等于 `N_THREADS - 1`,表示所有线程都已到达 barrier,此时会输出 "All threads have reached the barrier."。然后它会调用 `sem_wait(&barrier)` 来等待其他线程到达 barrier,最后再调用 `sem_post(&barrier)` 来释放其他线程。这样,每个线程都会等待所有线程到达 barrier,然后再执行后面的操作,从而实现了 barrier。
阅读全文