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,