编写C程序,使用Linux操作系统中的信号量机制模拟解决经典的进程同步问题:生产者-消费者问题。假设有一个生产者和一个消费者,缓冲区可以存放产品,生产者不断生产产品并存入缓冲区,消费者不断从缓冲区中取出产品并消费
时间: 2024-12-02 10:13:54 浏览: 12
操作系统实验三进程同步
在C语言中,我们可以使用Linux提供的信号量(semaphores)来解决生产者-消费者问题。信号量是一种并发控制工具,用于协调多个进程对共享资源的竞争访问。下面是一个简单的示例,展示了如何使用`semaphore.h`库来模拟这个场景:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define BUFFER_SIZE 10
sem_t empty, full, mutex;
// 生产者函数
void* producer(void* arg) {
int i = 0;
while (1) {
// 获取空闲信号量
sem_wait(&empty);
if (i >= BUFFER_SIZE) break; // 生产过剩,停止生产
printf("Producer produced item %d\n", i++);
// 将产品放入缓冲区
sem_post(&full); // 通知消费者缓冲区中有产品了
sem_wait(&mutex); // 确保互斥操作
// ...其他生产操作...
sem_post(&mutex); // 释放互斥锁
}
}
// 消费者函数
void* consumer(void* arg) {
int j = 0;
while (1) {
// 获取满信号量
sem_wait(&full);
if (j == BUFFER_SIZE) break; // 消费完毕,退出循环
printf("Consumer consumed item %d\n", j++);
// ...其他消费操作...
sem_post(&mutex); // 释放互斥锁
sem_wait(&empty); // 通知生产者缓冲区已清空
}
}
int main() {
int rc;
pthread_t producer_thread, consumer_thread;
// 初始化信号量
rc = sem_init(&empty, 0, BUFFER_SIZE);
rc = sem_init(&full, 0, 0);
rc = sem_init(&mutex, 0, 1); // 锁初始状态为1,表示只有一个线程占用
// 创建线程
rc = pthread_create(&producer_thread, NULL, producer, NULL);
rc = pthread_create(&consumer_thread, NULL, consumer, NULL);
// 等待线程结束
pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);
// 清理信号量
sem_destroy(&empty);
sem_destroy(&full);
sem_destroy(&mutex);
return 0;
}
```
在这个例子中,我们创建了三个信号量:`empty`代表缓冲区为空,`full`代表缓冲区满,`mutex`用于保护共享数据结构免受竞态条件影响。生产者和消费者分别通过获取/释放这些信号量来协调它们的操作。
阅读全文