資源簡介
程序是在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語言編寫的掃雷程序
評論
共有 條評論