编写C程序,使用Linux操作系统中的信号量机制模拟解决经典的进程同步问题:生产者-消费者问题。假设有一个生产者和一个消费者,缓冲区可以存放产品,生产者不断生产产品并存入缓冲区,消费者不断从缓冲区中取出产品并消费。
时间: 2024-11-15 17:23:00 浏览: 44
在Linux中,我们可以利用`<semaphore.h>`头文件提供的信号量(Semaphore)机制来解决生产者-消费者问题。信号量是一种用于控制并发访问资源的数量的同步工具。以下是基本步骤:
1. **初始化**:
- 创建两个信号量:`sem_init(&prod_sem, 0, 1)` (生产者信号量,初值为1) 和 `sem_init(&cons_sem, 0, 0)` (消费者信号量,初值为0)。
2. **生产者**:
- 生产产品时,先递减生产者信号量 (`sem_wait(&prod_sem)`),表示缓冲区中有空间;
- 然后生产产品并将信号量加一 (`sem_post(&prod_sem)`),表示缓冲区空闲了。
3. **消费者**:
- 消费产品前,先递增消费者信号量 (`sem_wait(&cons_sem)`),表示有产品等待;
- 取出产品后,减一并唤醒潜在的消费者 (`sem_post(&cons_sem)`),允许其他消费者开始。
4. **循环体**:
- 生产者和消费者分别在无限循环中运行,直到满足退出条件。
5. **结束操作**:
- 当所有产品都被消费完或不再生产时,生产者或消费者释放全局资源,并可能退出。
这是一个基础示例,实际应用中可能需要添加错误处理和终止条件检查。以下是简化版的伪代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#define BUFFER_SIZE 10
sem_t prod_sem, cons_sem;
void producer() {
int item = 0;
while (item != -1) {
// 生产...
sem_wait(&prod_sem);
item = ...; // 生产产品
printf("Produced %d\n", item);
sem_post(&cons_sem); // 提供给消费者
}
}
void consumer() {
while (1) {
// 消费...
sem_wait(&cons_sem);
...; // 消费产品
printf("Consumed an item\n");
sem_post(&prod_sem); // 通知生产者缓冲区可用
}
}
int main() {
if (sem_init(&prod_sem, 0, 1) == -1 || sem_init(&cons_sem, 0, 0) == -1) {
perror("Semaphore initialization failed");
return 1;
}
// 启动生产者和消费者线程
pthread_t producer_thread, consumer_thread;
if (pthread_create(&producer_thread, NULL, producer, NULL) == -1 ||
pthread_create(&consumer_thread, NULL, consumer, NULL) == -1) {
perror("Thread creation failed");
return 1;
}
// 等待线程完成
pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);
// 清理
sem_destroy(&prod_sem);
sem_destroy(&cons_sem);
return 0;
}
```
阅读全文