资源简介
程序是在vc++2005上运行通过的,在vc6上运行有问题,不过只需要修改输出部分,应该还是可以的。
此外,在vc2005上运行时,由于WaitForMultiObjects函数只能等待64个线程,因此,只要生产者和消费者总数不超过64个就没问题,实际上,即使超过64个线程,通过修改WaitForMultiObjects函数等待对象个数为64,也是可以运行的。我测试了很多次,包括极端的情况(比如1000个生产者1个消费者或者相反的情形),没有问题。
如果需要帮助,可以和我联系。
操作系统中典型的同步问题,m个生产者,n个消费者链接在具有k个单位缓冲区的有界环形缓冲区上,生产者和消费者是并发线程,只要缓冲区未满,生产者线程就可以生产一件产品放入其中,只要缓冲区不空,消费者就可以从中取出一件产品消费。
代码片段和文件信息
//生产者-消费者问题
#include
#include
#include
using namespace std;
#define BUF_SIZE 255//字符缓冲区的最大大小,用于输出提示信息
#define MAX_PRODUCER 10 //生产者线程数量
#define MAX_CONSUMER 10 //消费者线程数量
#define MAX_BUF_SIZE 100 //产品缓冲区大小
#define SLEEP_INTERVAL 100.0 //休息时间,该值越大,线程交替速度越慢
typedef struct _Product
{
DWORD _ProductId;
DWORD dwThreadId;
}PRODUCT*PPRODUCT;
HANDLE hEmpty; //可用的空缓冲区数,初值为MAX_BUF_SIZE
HANDLE hFull; //缓冲区内可用的产品数,初值为0
HANDLE hMutex; //互斥访问缓冲区及下面的两个变量
int in=0; //记录生产者存放产品的缓冲区指针--生产者使用
int out=0; //记录消费者取出产品的缓冲区指针--消费者使用
PPRODUCT buffer[MAX_BUF_SIZE];//产品缓冲区
//生产者线程
DWORD WINAPI ThreadProduce(LPVOID lpParam)
{
HANDLE hStdout;
TCHAR msgBuf[BUF_SIZE];
size_t cchStringSize;
DWORD dwChars;
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if( hStdout == INVALID_HANDLE_VALUE )
return 1;
PDWORD pData;
PPRODUCT p;
pData = (PDWORD)lpParam;
while(1)
{
//生产一件产品
p=(PPRODUCT)HeapAlloc(GetProcessHeap() HEAP_ZERO_MEMORYsizeof(PRODUCT));
p->_ProductId=GetTickCount();//产品编号为
p->dwThreadId=*pData;
WaitForSingleobject(hEmptyINFINITE);//P操作
WaitForSingleobject(hMutexINFINITE);//P操作
buffer[in]=p;
StringCchPrintf(msgBuf BUF_SIZE TEXT(“线程%ld 生产一件产品,产品编号为%d加入到缓冲区中的第%d个位置\n“)
p->dwThreadIdp->_ProductIdin);
in=(in+1)%MAX_BUF_SIZE;
StringCchLength(msgBuf BUF_SIZE &cchStringSize);
WriteConsole(hStdout msgBuf (DWORD)cchStringSize &dwChars NULL);
ReleaseMutex(hMutex);//V操作
ReleaseSemaphore(hFull1NULL); //V操作
Sleep((DWORD)(SLEEP_INTERVAL*rand()/RAND_MAX));//线程暂停一会,也是为了模拟生产过程的不确定性
}
return 0;
}
//消费者线程
DWORD WINAPI ThreadComsumer( LPVOID lpParam )
{
HANDLE hStdout;
TCHAR msgBuf[BUF_SIZE];
size_t cchStringSize;
DWORD dwChars;
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if( hStdout == INVALID_HANDLE_VALUE )
return 1;
PDWORD pData;
PPRODUCT p;
pData = (PDWORD)lpPar
- 上一篇:opencv实现小波变换
- 下一篇:用c语言编写的扫雷程序
相关资源
- 操作系统 作业调度算法FCFS SJF HRN C语
- 操作系统 C++ 页面置换算法含实验报告
- 优先级和时间片轮转调度实验算法c语
- 操作系统 缓冲池 C++
- 操作系统处理机作业-电梯调度模拟
- 操作系统实验 循环首次适应算法C
- 单处理器系统的进程调度+操作系统(
- 一个简单的文件系统操作系统课程设
- 文件系统 操作系统实验 C++
- 操作系统C语言实现银行家算法,键盘
- 生产者消费者问题C++语言
- 操作系统 课程设计 C++ 读者写着问题
- 操作系统 课程设计 C++ 模拟文件系统
- 分段式管理系统
- 操作系统课程设计 文件管理 C C++
- 操作系统课程设计——多线程同步演
- 文件系统的用户界面[含答案]
- 进程管理和调度的算法实现
- 用C#和C++实现的进程调度算法程序操作
- 操作系统实验--电梯调度 VC++实现
- 基于C++的ATM机操作系统设计
- 操作系统课程设计银行家算法C语言
- 操作系统3种页面置换算法 C++实现
- 操作系统中的文件管理模拟
- 操作系统CPU调度算法之最短剩余时间
- 操作系统设备管理模拟 银行家算法
- c++操作系统进程管理模拟
- 生产者与消费者问题
- 操作系统进程调度算法——短作业优
- 多级反馈队列调度算法C语言源代码
评论
共有 条评论