• 大小: 4KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-06-14
  • 语言: C/C++
  • 标签: 操作系统  OS  C/C++  

资源简介

程序是在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

评论

共有 条评论