生产者消费者问题c语言实现windows,用C语言编写程序:生产者和消费者之间实现同步与互斥问题...

满意答案

dcebd7a0de6265b6ccae5ead692f1eab.png

woliumoran

推荐于 2017.12.16

dcebd7a0de6265b6ccae5ead692f1eab.png

采纳率:46%    等级:12

已帮助:3950人

//整个程序以伪代码形式给出,当做一个提示吧,这样你同学就应该有思路了

//程序中有注释部分和需要他自己完善的部分,我给的是框架

//老师只是要求用C程序模拟这个机制来实现,就是通过你所学的知识模拟一个效果即可

//利用P,V操作使得在同一时刻,生产者和消费者只能有一个对存储区操作(即临界区)。

//如果两者同时对存储区操作,即同时取和生产的话,必定会有一个等待,当另一个完成操作后自己才会被唤醒。

//生产者在存储区满时不能再生产,进入等待,消费者同理

//完成同步互斥效果

//希望对你朋友有启发

/*----以下为代码部分-----*/

//定义全局变量

int empty = 1;//信号量表示存储单元空,可以生产产品

int full = 0;//信号量表示存储单元空,不可以消费产品

//P操作

void P(int &mutex)

{

*mutex--;

if(*mutex<0)

{

//当前进程挂起的程序实现

}

}

//V操作

void V(int &mutex)

{

*mutex++;

if(*mutex <=0)

{

//唤醒等待中的进程程序实现

}

}

//生产者程序

void producer()

{

P(& empty);//若此时存储区空,则可以生产,否则程序挂起等待

//生产一个产品操作

V(&full);//通知消费者进程,可以取产品

}

//消费者程序

void consumer(){

P(&full);//若此时存储区不空,则可以取产品,否则消费者程序挂起等待

//取走一个产品操作

V(& empty);//通知生产者进程可以生产

}

//主函数

void main()

{

//分别调用生产者,消费者程序,顺序不限,因为已经完成信号量的同步,若发生同步问题就会等待

producer();

consumer();

consumer();

producer();

………………

}

10分享举报

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的进程同步生产者消费者C语言实现: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> #define BUFFER_SIZE 10 // 缓冲区大小 #define PRODUCE_TIMES 20 // 生产者生产次数 #define CONSUME_TIMES 20 // 消费者消费次数 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 互斥锁 pthread_cond_t full = PTHREAD_COND_INITIALIZER; // 缓冲区满的条件变量 pthread_cond_t empty = PTHREAD_COND_INITIALIZER; // 缓冲区空的条件变量 int buffer[BUFFER_SIZE]; // 缓冲区 int buffer_index = 0; // 缓冲区当前索引的位置 void *producer(void *arg) { int i, j, data; for (i = 0; i < PRODUCE_TIMES; i++) { data = rand() % 1000; // 生随机数作为生产者产生的数据 pthread_mutex_lock(&mutex); // 上锁 while (buffer_index == BUFFER_SIZE) { // 缓冲区已满,则等待 pthread_cond_wait(&full, &mutex); } buffer[buffer_index++] = data; // 将数据存入缓冲区 printf("producer produced data %d\n", data); pthread_cond_signal(&empty); // 发出缓冲区非空的信号 pthread_mutex_unlock(&mutex); // 解锁 sleep(rand() % 3); // 生产者休息一段时间 } pthread_exit(NULL); } void *consumer(void *arg) { int i, j, data; for (i = 0; i < CONSUME_TIMES; i++) { pthread_mutex_lock(&mutex); // 上锁 while (buffer_index == 0) { // 缓冲区为空,则等待 pthread_cond_wait(&empty, &mutex); } data = buffer[--buffer_index]; // 从缓冲区取出数据 printf("consumer consumed data %d\n", data); pthread_cond_signal(&full); // 发出缓冲区非满的信号 pthread_mutex_unlock(&mutex); // 解锁 sleep(rand() % 3); // 消费者休息一段时间 } pthread_exit(NULL); } int main() { pthread_t producer_thread, consumer_thread; srand(time(NULL)); // 初始化随机数种子 pthread_create(&producer_thread, NULL, producer, NULL); // 创建生产者线 pthread_create(&consumer_thread, NULL, consumer, NULL); // 创建消费者线 pthread_join(producer_thread, NULL); // 等待生产者线结束 pthread_join(consumer_thread, NULL); // 等待消费者线结束 pthread_mutex_destroy(&mutex); // 销毁互斥锁 pthread_cond_destroy(&full); // 销毁条件变量 pthread_cond_destroy(&empty); // 销毁条件变量 return 0; } ``` 在这个例子生产者消费者共享一个缓冲区,生产者不断地生产数据并将其存入缓冲区,消费者不断地从缓冲区取出数据进行消费。为了保证生产者消费者同步,我们使用了互斥锁和条件变量。 当生产者试图往缓冲区存入数据时,如果缓冲区已满,则生产者会等待,直到消费者取出数据后缓冲区非满;当消费者试图从缓冲区取出数据时,如果缓冲区为空,则消费者会等待,直到生产者存入数据后缓冲区非空。这样就保证了生产者消费者同步

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值