资源简介
进程同步实验——生产者与消费者问题算法实现

代码片段和文件信息
/*————————————————————————————————
在同一个进程地址空间内执行的两个线程。生产者线程生产物品,
然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线
程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物
品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者
线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有
满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出
来。
——————————————————————————————————*/
#include
#include
#include
const unsigned short SIZE_OF_BUFFER = 10; //缓冲区长度
unsigned short ProductID = 0; //产品号
unsigned short ConsumeID = 0; //将被消耗的产品号
unsigned short in = 0; //产品进缓冲区时的缓冲区下标
unsigned short out = 0; //产品出缓冲区时的缓冲区下标
int g_buffer[SIZE_OF_BUFFER]; //缓冲区是个循环队列
bool g_continue = true; //使程序跳出循环,控制程序结束
HANDLE g_hMutex; //用于线程间的互斥
HANDLE g_hFullSemaphore; //当缓冲区满时迫使生产者等待
HANDLE g_hEmptySemaphore; //当缓冲区空时迫使消费者等待
DWORD WINAPI Producer(LPVOID); //生产者线程
DWORD WINAPI Consumer(LPVOID); //消费者线程
int main()
{
//创建各个互斥信号
g_hMutex = CreateMutex(NULLFALSENULL); // 三个参数分别为:指向安全属性的指针
//初始化互斥对象的所有者指向互斥对象名的指针
//创建缓冲区满的信号量
g_hFullSemaphore = CreateSemaphore(NULLSIZE_OF_BUFFER-1SIZE_OF_BUFFER-1NULL);
//四个参数分别为:表示是否允许继承、
//设置信号机的初始计数、设置信号机的
//最大计数、指定信号机对象的名称(-1是因为计数从0开始)
//创建缓冲区空的信号量
g_hEmptySemaphore = CreateSemaphore(NULL0SIZE_OF_BUFFER-1NULL);
//调整下面的数值,可以发现,当生产者个数多于消费者个数时,
//生产速度快,生产者经常等待消费者;反之,消费者经常等待
const unsigned short PRODUCERS_COUNT = 3; //生产者的个数
const unsigned short CONSUMERS_COUNT = 3; //消费者的个数
//总的线程数
const unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT;
HANDLE hThreads[PRODUCERS_COUNT]; //各线程的handle
DWORD producerID[CONSUMERS_COUNT]; //生产者线程的标识符
DWORD consumerID[THREADS_COUNT]; //消费者线程的标识符
//为每一个生产者创建生产者线程
for(int i=0;i hThreads[i]=CreateThread(NULL0ProducerNULL0&producerID[i]);
if (hThreads[i]==NULL) return -1;
}
//为每一个消费者创建消费者线程
for(int j=0;j hThreads[PRODUCERS_COUNT+j]=CreateThread(NULL0ConsumerNULL0&consumerID[j]);
if (hThreads[j]==NULL) return -1;
}
while(g_continue){
if(getchar()){ //按回车后终止程序运行
g_continue = false;
}
}
return 0;
}
//生产一个产品。简单模拟了一下,仅输出新产品的ID号
void Produce()
{
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 184436 2009-01-04 20:40 Debug\sx3.exe
文件 229928 2009-01-04 20:40 Debug\sx3.ilk
文件 25242 2009-01-04 20:40 Debug\sx3.obj
文件 3616828 2009-01-04 20:40 Debug\sx3.pch
文件 394240 2009-01-04 20:40 Debug\sx3.pdb
文件 148480 2009-01-04 20:40 Debug\vc60.idb
文件 86016 2009-01-04 20:40 Debug\vc60.pdb
文件 208955 2007-12-31 21:33 sx3(1消费者,3个生产者).exe
文件 208954 2008-01-03 20:43 sx3(3个生产者,4个消费者,15个缓冲区).exe
文件 208955 2007-12-31 21:37 sx3(3个消费者,1个生产者).exe
文件 208955 2007-12-31 21:38 sx3(3个消费者,3个生产者).exe
文件 6847 2007-12-31 22:00 sx3.cpp
文件 3365 2009-01-04 20:40 sx3.dsp
文件 531 2009-01-04 20:41 sx3.dsw
文件 33792 2009-01-04 20:41 sx3.ncb
文件 48640 2009-01-04 20:41 sx3.opt
文件 731 2009-01-04 20:40 sx3.plg
文件 1412608 2009-01-03 21:11 操作系统原理实验报告.doc
目录 0 2009-01-04 20:40 Debug
----------- --------- ---------- ----- ----
7027503 19
相关资源
- 计算机图形学 边填充算法实现代码
- 关联分析Apriori算法实现
- 带头结点的单链表的c算法实现
- 电梯模拟程序C/C 算法实现
- 大数阶乘的C 算法实现
- 基于OpenCV的分水岭算法实现
- 数据挖掘18大算法实现以及其他相关经
- SM2国密算法实现基于mircal的实现
- Skyline高效检索算法实现.zip
- MapReduce基于物品的协同过滤算法实现
- PID-增量式PID和位置式PID算法实现和
- 基于小波变换的语音信号去噪及其D
- 基于八叉树的网格简化算法实现
- 数字水印的多种算法实现
- ISODATA算法实现图像分类
- 基于平面的三角面片合并为多边形的
- 智能车PID+算法实现原理讲解
- A星算法实现路径规划
- 水库优化调度poa算法实现
- Marching cubes算法实现对切片集的三维重
- 同态加密算法实现
- OpenGL使用画家算法实现隐藏面的消除
- 贝叶斯模型LDA贝叶斯算法实现的电商
- 正向最大匹配算法实现中文分词
- 缺失数据多重插补处理方法的算法实
- 经典光线追踪算法实现
- 电力系统无功优化的遗传算法实现
- 算法实现.zip
- K-Means图像分割算法实现
- 社团发现算法实现
评论
共有 条评论