资源简介
进程同步实验——生产者与消费者问题算法实现
代码片段和文件信息
/*————————————————————————————————
在同一个进程地址空间内执行的两个线程。生产者线程生产物品,
然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线
程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物
品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者
线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有
满的缓冲区,那么消费者线程将被阻塞,直到新的物品被生产出
来。
——————————————————————————————————*/
#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
相关资源
- 基于分布式算法实现FIR滤波器
- SIFT算法实现及代码详解239444
- TranSE算法实现及测试
- 《数据结构》算法实现及解析--高一凡
- SURF算法+单应矩阵+RANSAC算法实现拼接
- 贪心算法实现0-1背包问题,包含k阶优
- OpenCV算法实现参考文献
- Mahout推荐算法usercf itemcfslopeone三种算
- 常见图像分割算法实现源代码
- STM32下二维码识别算法实现
- 基于TI+DSP的通用算法实现+林静然编著
- 基于TI+DSP的通用算法实现+林静然编著
- 基于Vivado HLS在zedboard中的Sobel滤波算法
- rsa算法实现系统
- 模板匹配算法实现
- 搜索引擎PageRank算法实现及测试数据
- 页面置换算法实现(有界面)
- 基于聚类(Kmeans)算法实现的客户价
- 点云数据的Marching Cube算法实现
- 材料学的纳米尺度计算模拟从基本原
- ImageFusion.zip
- 实验三 图像编码算法实现
- 基于Hadoop的Kmeans算法实现
- KNN算法实现手写数字识别的三种方法
- 合成孔径雷达成像与算法实现含代码
- 线图句法分析算法实现
- 物体的运动轨迹预测扩展卡尔曼滤波
- CYK算法实现句法分析perl
- 粒子群聚类算法实现
- R语言与网站分析:数据集样例及分类
评论
共有 条评论