ZKX's LAB

信号量解决生产者消费者 生产者消费者问题,为什么不能用一个信号量实现同步

2020-10-12知识22

有关利用记录型信号量解决生产者消费者的问题? 有一群生产者2113进程在生产产品,并将这些产5261品提供给消费者进程4102去消费。为使生产者进1653程与消费者进程能并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将其所生产的产品放入一个缓冲区中;消费者进程可从一个缓冲区中取走产品去消费。尽管所有的生产者进程和消费者进程都是以异步方式运行的,但它们之间必须保持同步,既不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区投放产品。参考代码:int in=0,out=0;in:输入指针,out:输出指针;item buffer[n];n个缓冲区组成的数组;semaphore mutex=1,full=0,empty=n;mutex:互斥信号量,生产者进程和消费者进程都只能互斥访问缓冲区;full:资源信号量,满缓冲区的数量;empty:资源信号量,空缓冲区的数量;信号量不允许直接参与运算,故都要定义;生产者程序;void Producer(){do {生产者生产一个产品nextp;wait(empty);申请一个空缓冲区;wait(mutex);申请临界资源;buffer[in]=nextp;将产品添加到缓冲区;in=(in+1)%n;类似于循环队列;signal(mutex);释放临界资源;signal(full);释放一个满缓冲区;} while(TRUE);}消费者程序;void Producer(){do {。

信号量解决生产者消费者 生产者消费者问题,为什么不能用一个信号量实现同步

生产者消费者问题,为什么不能用一个信号量实现同步 因为信号量是用于表示资源使用情况的一个数据结构。因此,只有同一类资源才能使用一个信号量。在生产者消费者问题的同步中,生产者需要的资源是仓库中空位置,只有当有空位置时,生产者才能将产品放入仓库,而消费者从仓库中取走一个产品后就会释放仓库中的一个空位置。另外,消费者需要的资源是产品,只有仓库中有产品,消费者才能去取。

信号量解决生产者消费者 生产者消费者问题,为什么不能用一个信号量实现同步

生产者消费者问题,为什么不能用一个信号量实现同步? n=10mutex=1producer:P(mutex)V(n)V(mutex)cosumer:P(mutex)P(n)V(mute…

信号量解决生产者消费者 生产者消费者问题,为什么不能用一个信号量实现同步

在windows操作系统中用信号量机制解决生产者消费者问题的代码 windows里面信号量比较难用,下面是我模仿一本教材写的一个例子,加了一些注释,在.net 2008环境下调试通过的。你可以参考下,不过直接复制过去是很难调的过的吧,还有其他一些相关文件。ProducerCustomer2.cpp:定义控制台应用程序的入口点。include\"stdafx.hincludeinclude<;fstream>;/与课本不同include<;iostream>;/与课本不同includeincludeusing namespace std;定义一些常量;本程序允许的最大临界区数;define MAX_BUFFER_NUM 10秒到毫秒的乘法因子;define INTE_PER_SEC 1000本程序允许的生产和消费线程的总数;define MAX_THREAD_NUM 64定义一个结构,记录在测试文件中指定的每一个线程的参数struct ThreadInfo{int serial;线程序列号char entity;是P还是Cdouble delay;线程延迟int thread_request[MAX_THREAD_NUM];线程请求队列int n_request;请求个数};全局变量的定义临界区对象的声明,用于管理缓冲区的互斥访问;CRITICAL_SECTION PC_Critical[MAX_BUFFER_NUM];int Buffer_Critical[MAX_BUFFER_NUM];缓冲区声明,用于存放产品;HANDLE h_Thread[MAX_THREAD_NUM];用于存储每个线程句柄的数组;ThreadInfo Thread_Info[MAX_THREAD_NUM];线程信息数组;。

#num#信号量#生产者消费者问题#多线程#线程阻塞

随机阅读

qrcode
访问手机版