在linux系统中用c语言写生产者和消费者的代码
时间: 2024-10-11 18:08:31 浏览: 42
在Linux系统中,使用C语言编写生产者消费者(Producer-Consumer)模型是一种常见的并发控制方式,它通常用于多线程环境下模拟资源的竞争。生产者负责生成数据放入共享缓冲区,而消费者则从缓冲区取出数据进行处理。下面是一个简单的例子:
```c
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#define BUFFER_SIZE 5
// 定义缓冲区和信号量
int buffer[BUFFER_SIZE] = {0};
sem_t empty, full;
void *producer(void *arg) {
int i;
while (1) {
// 生产者尝试获取空闲锁
sem_wait(&empty);
// 如果缓冲区满,生产者阻塞直到消费者消费掉一些数据
if (buffer_full()) {
sem_wait(&full);
}
// 生产数据并放入缓冲区
buffer[i % BUFFER_SIZE] = i++;
// 提示其他消费者缓冲区有新数据
sem_post(&full);
printf("Produced: %d\n", i - 1);
}
return NULL;
}
void *consumer(void *arg) {
while (1) {
// 消费者尝试获取满的数据
sem_wait(&full);
// 如果缓冲区为空,消费者阻塞直到生产者填充数据
if (buffer_empty()) {
sem_wait(&empty);
}
// 从缓冲区取出并处理数据
printf("Consumed: %d\n", buffer[0]);
buffer[0] = 0; // 清除缓冲区
// 通知生产者缓冲区已清空
sem_post(&empty);
}
return NULL;
}
void init_sema() {
sem_init(&empty, 0, BUFFER_SIZE); // 初始化空信号量
sem_init(&full, 0, 0); // 初始化满信号量
}
void buffer_full() {
return sem_getvalue(&full, &i) == 0 && i == 0;
}
void buffer_empty() {
return sem_getvalue(&empty, &i) > 0 && i == BUFFER_SIZE;
}
int main() {
pthread_t producer_thread, consumer_thread;
init_sema();
pthread_create(&producer_thread, NULL, producer, NULL);
pthread_create(&consumer_thread, NULL, consumer, NULL);
pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);
return 0;
}
```
阅读全文
相关推荐














