用C语言信号量编写程序创建三个线程一次输出ABC,输出10遍
时间: 2023-12-18 07:02:52 浏览: 39
下面是用C语言信号量编写程序创建三个线程一次输出ABC,输出10遍的示例代码:
```c
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#define THREAD_NUM 3
#define LOOP_NUM 10
sem_t sem[THREAD_NUM];
void *thread_func(void *arg) {
char *name = (char *)arg;
int id = name[0] - 'A';
int next_id = (id + 1) % THREAD_NUM;
for (int i = 0; i < LOOP_NUM; i++) {
sem_wait(&sem[id]);
printf("%c", name[0]);
sem_post(&sem[next_id]);
}
pthread_exit(NULL);
}
int main() {
pthread_t threads[THREAD_NUM];
char names[THREAD_NUM][2] = {"A", "B", "C"};
for (int i = 0; i < THREAD_NUM; i++) {
sem_init(&sem[i], 0, 0);
}
sem_post(&sem[0]);
for (int i = 0; i < THREAD_NUM; i++) {
pthread_create(&threads[i], NULL, thread_func, (void *)names[i]);
}
for (int i = 0; i < THREAD_NUM; i++) {
pthread_join(threads[i], NULL);
}
printf("\n");
for (int i = 0; i < THREAD_NUM; i++) {
sem_destroy(&sem[i]);
}
return 0;
}
```
在这个程序中,我们创建了三个线程,分别代表输出 A、B、C。为了保证输出顺序,我们使用了三个信号量 sem[0]、sem[1]、sem[2],分别对应三个线程。每个线程在输出自己的字符之前,需要等待前一个线程的信号量 sem[i]。当前一个线程输出完毕后,会释放自己的信号量 sem[(i+1)%3],使得下一个线程可以输出。最后,我们使用 pthread_join 函数等待所有线程执行完毕,并释放信号量。