用C语言 利用线程信号量使三个线程交替循环输出10次
时间: 2024-05-06 14:22:00 浏览: 87
以下是一种可能的解决方案:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define NUM_THREADS 3
#define NUM_LOOPS 10
sem_t semaphores[NUM_THREADS];
void* thread_func(void* arg) {
int id = *(int*)arg;
for (int i = 0; i < NUM_LOOPS; i++) {
sem_wait(&semaphores[id]);
printf("Thread %d: %d\n", id, i);
sem_post(&semaphores[(id + 1) % NUM_THREADS]);
}
pthread_exit(NULL);
}
int main() {
pthread_t threads[NUM_THREADS];
int thread_ids[NUM_THREADS];
for (int i = 0; i < NUM_THREADS; i++) {
sem_init(&semaphores[i], 0, 0);
thread_ids[i] = i;
pthread_create(&threads[i], NULL, thread_func, &thread_ids[i]);
}
sem_post(&semaphores[0]);
for (int i = 0; i < NUM_THREADS; i++) {
pthread_join(threads[i], NULL);
sem_destroy(&semaphores[i]);
}
return 0;
}
```
该程序首先定义了三个信号量,每个线程一个。然后创建三个线程,每个线程都调用`thread_func`函数。`thread_func`函数首先接受线程ID作为参数,然后使用一个循环来输出数字并交替地等待和释放信号量。每个线程都等待其对应的信号量,输出数字后释放下一个线程的信号量,以此类推,实现交替输出。最后,主线程等待所有线程完成并销毁信号量。
注意,信号量的初始值为0,因此第一个线程需要在开始时手动释放它的信号量。在这个例子中,我们使用了一个简单的数组来保存线程ID,但实际上可能需要更复杂的数据结构来跟踪线程之间的依赖关系。
阅读全文