91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

  • 大小: 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

評論

共有 條評論