模拟生产者消费者实现进程同步与互斥的代码
时间: 2023-12-29 11:49:12 浏览: 127
生产者与消费者 进程的同步与互斥模拟
5星 · 资源好评率100%
以下是一个基于信号量实现的生产者消费者问题的代码示例:
```c++
#include <stdio.h>
#include <semaphore.h>
#include <pthread.h>
#define N 5 // 缓冲区大小
int buffer[N]; // 缓冲区
sem_t empty, full; // 信号量
void *producer(void *arg) {
int item = 0;
while (1) {
sem_wait(&empty); // P(empty)
buffer[item] = item + 1; // 生产物品
printf("Producer produces item %d\n", item+1);
item = (item + 1) % N;
sem_post(&full); // V(full)
}
pthread_exit(NULL);
}
void *consumer(void *arg) {
int item = 0;
while (1) {
sem_wait(&full); // P(full)
item = buffer[item]; // 消费物品
printf("Consumer consumes item %d\n", item);
item = (item + 1) % N;
sem_post(&empty); // V(empty)
}
pthread_exit(NULL);
}
int main(int argc, char *argv[]) {
pthread_t producer_t, consumer_t;
sem_init(&empty, 0, N); // 初始化信号量empty
sem_init(&full, 0, 0); // 初始化信号量full
pthread_create(&producer_t, NULL, producer, NULL);
pthread_create(&consumer_t, NULL, consumer, NULL);
pthread_join(producer_t, NULL);
pthread_join(consumer_t, NULL);
sem_destroy(&empty); // 删除信号量empty
sem_destroy(&full); // 删除信号量full
return 0;
}
```
其中,信号量empty的初始值为缓冲区大小,信号量full的初始值为0。sem_wait和sem_post函数分别对信号量进行P和V操作。在生产者和消费者线程中,先对空缓冲区进行P操作,再进行生产/消费操作,最后对满缓冲区进行V操作。这样就实现了生产者消费者进程的同步与互斥。
阅读全文