生产者消费者c语言代码_生产者消费者问题、父子进程、信号量(IPC机制):代码分享...
时间: 2023-06-26 18:06:16 浏览: 88
以下是一个基于信号量(Semaphore)的生产者消费者问题解决方案,使用了POSIX库中的sem_init、sem_wait、sem_post、sem_destroy函数。
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define BUFFER_SIZE 10
// 缓冲区
int buffer[BUFFER_SIZE];
// 生产者和消费者都可以访问的变量
int in = 0; // 待插入元素的位置
int out = 0; // 待取出元素的位置
// 信号量
sem_t empty; // 空槽数量
sem_t full; // 满槽数量
sem_t mutex; // 互斥量
void *producer(void *arg) {
int item;
while (1) {
item = rand() % 1000; // 生成一个随机的待插入元素
sem_wait(&empty); // 等待空槽
sem_wait(&mutex); // 互斥地访问缓冲区
buffer[in] = item;
printf("Producer insert item %d at position %d.\n", item, in);
in = (in + 1) % BUFFER_SIZE;
sem_post(&mutex); // 释放互斥量
sem_post(&full); // 增加满槽数量
}
}
void *consumer(void *arg) {
int item;
while (1) {
sem_wait(&full); // 等待满槽
sem_wait(&mutex); // 互斥地访问缓冲区
item = buffer[out];
printf("Consumer remove item %d from position %d.\n", item, out);
out = (out + 1) % BUFFER_SIZE;
sem_post(&mutex); // 释放互斥量
sem_post(&empty); // 增加空槽数量
}
}
int main() {
// 初始化信号量
sem_init(&empty, 0, BUFFER_SIZE);
sem_init(&full, 0, 0);
sem_init(&mutex, 0, 1);
// 创建生产者和消费者线程
pthread_t p, c;
pthread_create(&p, NULL, producer, NULL);
pthread_create(&c, NULL, consumer, NULL);
// 等待线程结束
pthread_join(p, NULL);
pthread_join(c, NULL);
// 销毁信号量
sem_destroy(&empty);
sem_destroy(&full);
sem_destroy(&mutex);
return 0;
}
```
该代码使用三个信号量:empty表示空槽数量,full表示满槽数量,mutex表示互斥量。在生产者线程中,当缓冲区中有空槽时,它会等待empty信号量的值减1,并占用mutex信号量,插入元素后释放mutex信号量,增加full信号量的值。在消费者线程中,当缓冲区中有满槽时,它会等待full信号量的值减1,并占用mutex信号量,取出元素后释放mutex信号量,增加empty信号量的值。这样就实现了多线程下的生产者消费者问题。
需要注意的是,这个代码只是一个简单的示例,它还存在一些问题。例如,当缓冲区已满时,生产者线程会一直等待,而不是进行其他操作。在实际应用中,需要根据具体情况对代码进行修改和完善。
阅读全文