【操作系统】C++信号量解决生产者消费者问题及管程解决哲学家问题(课设)

本文介绍了如何使用C++的多线程、互斥锁和condition_variable来模拟信号量解决生产者消费者问题,以及在解决哲学家问题中应用管程。详细阐述了condition_variable的工作原理和避免虚假唤醒的重要性。
摘要由CSDN通过智能技术生成

C++信号量解决生产者消费者问题及管程解决哲学家问题(课设)

为什么不关注我这个持续更新作业的小可爱呢😘
此篇博客仅简要记录课设中遇到的一些困难及解决办法
管程可以直接跳到这个链接:
管程解决哲学家问题
但是由于两个问题都用的同一个知识,详细的讲解仅在这一篇中,需要的可以着重看第三个问题——使用condition_variable.

生产者消费者问题

生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案例。该问题描述了共享固定大小缓冲区的两个线程——即所谓的“生产者”和“消费者”——在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。
.
要解决该问题,就必须让生产者在缓冲区满时休眠(要么干脆就放弃数据),等到下次消费者消耗缓冲区中的数据的时候,生产者才能被唤醒,开始往缓冲区添加数据。同样,也可以让消费者在缓冲区空时进入休眠,等到生产者往缓冲区添加数据之后,再唤醒消费者。通常采用进程间通信的方法解决该问题。如果解决方法不够完善,则容易出现死锁的情况。出现死锁时,两个线程都会陷入休眠,等待对方唤醒自己。该问题也能被推广到多个生产者和消费者的情形。

实际上仅仅关于这个问题课上已经将的很清楚了,真正实现这个课设的困难在书中的解决方法都是抽象的而没有给出具体的解决,下表列出我们需要解决的几个问题。

问题 解决
实现生产者消费者并行互不干扰 < thread >
使用互斥量 < mutex >
使用记录型信号量 <condition_variable>和< mutex>模拟

我们的重点是解决第三个问题。OK,先一个个来。

问题1.使用多线程

对于这个课设没有用到< thread >很复杂的部分,指示用到了一个最基础的创建以及封装的"thread.join()"函数。下面简要说明:
首先,加入头文件

#include<thread>

注意Dev C++所集成的daogcc编译器版本较旧,这边推荐把编程环境换成Visual Studio,很香。
这样就可以在main()函数中创建线程了,如下格式

thread    thread_name(Funtion1);
thread_name.join();

”Funtion1“为这个线程执行函数的函数名。注意,如果函数有参数,则如下

thread thread_name(Function1,parameter);
thread_name.join();

注意“join()”是必须要调用的,join()的作用简要来说就是要等待线程结束后才进行进行下面的程序。如下是课设的main函数部分:

int main() {
   
	memset(item, 
  • 12
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值