(C语言)多进程实现消费者生产者pv操作,Windows和LInux版本

多进程实现消费者生产者问题

一,实验目的

1,了解生产者消费者的互斥与同步问题

2,掌握Windows和Linux的进程通信方法

二,实验要求

完成Windows版本和Linux版本。

一个大小为3的缓冲区,初始为空。

2个生产者

    • 随机等待一段时间,往缓冲区添加数据,
    • 若缓冲区已满,等待消费者取走数据后再添加
    • 重复6次

3个消费者

    • 随机等待一段时间,从缓冲区读取数据
    • 若缓冲区为空,等待生产者添加数据后再读取
    • 重复4次

显示每次添加和读取数据的时间及缓冲区的状态

三,实验环境

Windows版本:Windows 10 64位系统,Dev-cpp编译器

Linux版本:Fedora29版本,gcc环境 vim文本编辑器

四,实验代码结构

1),pv操作伪代码:

array[3]:interger//缓冲区定义,大小为三

int empty=3,full=0;

int mutex=1;

i=0,j=0//缓冲区指针

x,y:item //产品变量

生产者:                                                                                              消费者:

begin:

produce a product to x;

P(empty);

P(mutex);

array[i]=x;

ii=(i+1)%3;

V(full);

V(mutex);

,,,,,, .........,

End

消费者:

end

 

 

2)实验代码分析

Windows版本:

思路分析:Windows创建多进程使用creatprocess()函数调用自己,通过多次创建得到两个生产者进程三个消费者进程,在之中运行相应的生产者函数,消费者函数。在通过传入参数不同,来辨别是第一次主进程还是生产者进程,消费者进程。通过构建共享内存区进行进程间通信。

①多进程创建

 

② 构建共享内存区,再将文件映射到本进程,初始化

生产者消费者问题是经典的同步问题,可以使用pv操作(信号量)来解决。下面是一个使用pv操作实现生产者消费者问题的C语言代码示例: ``` #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> #define BUFFER_SIZE 10 // 缓冲区 int buffer[BUFFER_SIZE]; int in = 0, out = 0; // 信号量 sem_t full, empty, mutex; // 生产者线程函数 void *producer(void *arg) { int item; while (1) { // 生产一个物品 item = rand() % 100; // 等待缓冲区不满 sem_wait(&empty); sem_wait(&mutex); // 将物品放入缓冲区 buffer[in] = item; in = (in + 1) % BUFFER_SIZE; printf("Producer produced item %d\n", item); sem_post(&mutex); sem_post(&full); } } // 消费者线程函数 void *consumer(void *arg) { int item; while (1) { // 等待缓冲区不空 sem_wait(&full); sem_wait(&mutex); // 从缓冲区取出一个物品 item = buffer[out]; out = (out + 1) % BUFFER_SIZE; printf("Consumer consumed item %d\n", item); sem_post(&mutex); sem_post(&empty); } } int main() { pthread_t prod, cons; // 初始化信号量 sem_init(&mutex, 0, 1); sem_init(&empty, 0, BUFFER_SIZE); sem_init(&full, 0, 0); // 创建生产者消费者线程 pthread_create(&prod, NULL, producer, NULL); pthread_create(&cons, NULL, consumer, NULL); // 等待线程结束 pthread_join(prod, NULL); pthread_join(cons, NULL); // 销毁信号量 sem_destroy(&mutex); sem_destroy(&empty); sem_destroy(&full); return 0; } ``` 在上面的代码中,使用了三个信号量:`full`表示缓冲区中物品的数量,`empty`表示缓冲区中空闲位置的数量,`mutex`用于互斥访问缓冲区。在生产者线程中,首先生产一个物品,然后等待`empty`信号量,表示缓冲区有空闲位置;同时等待`mutex`信号量,表示对缓冲区的访问是互斥的;将物品放入缓冲区后,释放`mutex``full`信号量。在消费者线程中,首先等待`full`信号量,表示缓冲区中有物品;同时等待`mutex`信号量,表示对缓冲区的访问是互斥的;从缓冲区中取出一个物品后,释放`mutex``empty`信号量。 注意:上面的代码只是示例,实际应用中需要注意信号量的初始化销毁,以及线程的创建销毁等问题
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值