使用信号量控制完成下面的程序。设有三个进程,input进程、compute进程和output进程;它们通过共享一个缓冲区buf的合作关系如下: (1)input进程每次输入数据后,把数据送到buf,供compute进程计算和output进程打印;
时间: 2024-06-10 11:10:33 浏览: 20
(2)compute进程从buf取出数据进行计算,计算完毕后再把结果送回buf;(3)output进程从buf中取出结果并打印。为了保证正确性,buf中最多存储10个数据或结果,如果buf已满则input进程必须等待,如果buf为空则compute进程和output进程必须等待。
下面是使用信号量控制的程序实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#define BUF_SIZE 10
int buf[BUF_SIZE]; // 缓冲区
int in = 0; // 当前输入位置
int out = 0; // 当前输出位置
sem_t empty; // 空位置数的信号量
sem_t full; // 已占用位置数的信号量
sem_t mutex; // 互斥信号量
void *input(void *arg)
{
while (1) {
// 等待空位置
sem_wait(&empty);
// 互斥访问buf
sem_wait(&mutex);
// 输入数据
buf[in] = rand() % 100;
printf("[input] Input data %d to buf[%d]\n", buf[in], in);
in = (in + 1) % BUF_SIZE;
// 释放互斥信号量和已占用位置数信号量
sem_post(&mutex);
sem_post(&full);
// 等待一段时间
sleep(1);
}
}
void *compute(void *arg)
{
while (1) {
// 等待已占用位置
sem_wait(&full);
// 互斥访问buf
sem_wait(&mutex);
// 计算结果
int data = buf[out];
int result = data * data;
printf("[compute] Compute result %d from data %d in buf[%d]\n", result, data, out);
out = (out + 1) % BUF_SIZE;
// 释放互斥信号量和空位置数信号量
sem_post(&mutex);
sem_post(&empty);
}
}
void *output(void *arg)
{
while (1) {
// 等待已占用位置
sem_wait(&full);
// 互斥访问buf
sem_wait(&mutex);
// 输出结果
int result = buf[out];
printf("[output] Output result %d from buf[%d]\n", result, out);
out = (out + 1) % BUF_SIZE;
// 释放互斥信号量和空位置数信号量
sem_post(&mutex);
sem_post(&empty);
// 等待一段时间
sleep(1);
}
}
int main()
{
// 初始化信号量
sem_init(&empty, 0, BUF_SIZE);
sem_init(&full, 0, 0);
sem_init(&mutex, 0, 1);
// 创建线程
pthread_t tid_input, tid_compute, tid_output;
pthread_create(&tid_input, NULL, input, NULL);
pthread_create(&tid_compute, NULL, compute, NULL);
pthread_create(&tid_output, NULL, output, NULL);
// 等待线程结束
pthread_join(tid_input, NULL);
pthread_join(tid_compute, NULL);
pthread_join(tid_output, NULL);
// 销毁信号量
sem_destroy(&empty);
sem_destroy(&full);
sem_destroy(&mutex);
return 0;
}
```