C语言实现用线程信号量实现线程同步 1. main 函数中创建 4 个线程,然后等待 4 个线程结束后退出 2. 每个线程执行过程如下: 输出 Pi begin... 等待 1s 输出...Pi done
时间: 2024-05-04 18:22:27 浏览: 102
使用信号量实现线程同步
4星 · 用户满意度95%
下面是一个基于线程信号量的 C 语言程序实现多线程同步输出:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define THREAD_COUNT 4
sem_t semaphore;
void *thread_work(void *arg) {
int id = *(int *)arg;
printf("P%d begin...\n", id);
sleep(1);
sem_post(&semaphore);
sem_wait(&semaphore);
printf("...P%d done\n", id);
return NULL;
}
int main() {
pthread_t threads[THREAD_COUNT];
sem_init(&semaphore, 0, 0);
int ids[THREAD_COUNT];
for (int i = 0; i < THREAD_COUNT; i++) {
ids[i] = i + 1;
pthread_create(&threads[i], NULL, thread_work, &ids[i]);
}
for (int i = 0; i < THREAD_COUNT; i++) {
pthread_join(threads[i], NULL);
}
sem_destroy(&semaphore);
return 0;
}
```
在该程序中,我们使用了信号量来实现线程同步。主线程创建了 4 个子线程,每个子线程执行 `thread_work` 函数,打印 "P{ID} begin...",然后等待 1 秒钟,等待其他线程完成,再打印 "...P{ID} done"。
在 `main` 函数中,我们初始化了信号量,然后循环创建子线程。等所有子线程都完成之后,我们销毁信号量并结束程序。
注意到,我们使用 `sem_post(&semaphore)` 来释放信号量,这会导致其他等待该信号量的线程被唤醒。而 `sem_wait(&semaphore)` 则会使当前线程等待该信号量,直到信号量被释放为止。由于使用了信号量,我们在输出 "P{ID} done" 之前,可以确保其他线程已经执行完毕。
阅读全文