-
大小: 4KB文件類型: .cpp金幣: 1下載: 0 次發(fā)布日期: 2021-06-14
- 語言: C/C++
- 標簽: 操作系統(tǒng)??OS??C/C++??
資源簡介
程序是在vc++2005上運行通過的,在vc6上運行有問題,不過只需要修改輸出部分,應該還是可以的。
此外,在vc2005上運行時,由于WaitForMultiObjects函數(shù)只能等待64個線程,因此,只要生產(chǎn)者和消費者總數(shù)不超過64個就沒問題,實際上,即使超過64個線程,通過修改WaitForMultiObjects函數(shù)等待對象個數(shù)為64,也是可以運行的。我測試了很多次,包括極端的情況(比如1000個生產(chǎn)者1個消費者或者相反的情形),沒有問題。
如果需要幫助,可以和我聯(lián)系。
操作系統(tǒng)中典型的同步問題,m個生產(chǎn)者,n個消費者鏈接在具有k個單位緩沖區(qū)的有界環(huán)形緩沖區(qū)上,生產(chǎn)者和消費者是并發(fā)線程,只要緩沖區(qū)未滿,生產(chǎn)者線程就可以生產(chǎn)一件產(chǎn)品放入其中,只要緩沖區(qū)不空,消費者就可以從中取出一件產(chǎn)品消費。
代碼片段和文件信息
//生產(chǎn)者-消費者問題
#include?
#include?
#include?
using?namespace?std;
#define?BUF_SIZE?255//字符緩沖區(qū)的最大大小,用于輸出提示信息
#define?MAX_PRODUCER?10 //生產(chǎn)者線程數(shù)量
#define?MAX_CONSUMER?10 //消費者線程數(shù)量
#define?MAX_BUF_SIZE?100 //產(chǎn)品緩沖區(qū)大小
#define?SLEEP_INTERVAL?100.0 //休息時間,該值越大,線程交替速度越慢
typedef?struct?_Product
{
DWORD?_ProductId;
DWORD?dwThreadId;
}PRODUCT*PPRODUCT;
HANDLE?hEmpty; //可用的空緩沖區(qū)數(shù),初值為MAX_BUF_SIZE
HANDLE?hFull; //緩沖區(qū)內(nèi)可用的產(chǎn)品數(shù),初值為0
HANDLE?hMutex; //互斥訪問緩沖區(qū)及下面的兩個變量
int?in=0; //記錄生產(chǎn)者存放產(chǎn)品的緩沖區(qū)指針--生產(chǎn)者使用
int?out=0; //記錄消費者取出產(chǎn)品的緩沖區(qū)指針--消費者使用
PPRODUCT?buffer[MAX_BUF_SIZE];//產(chǎn)品緩沖區(qū)
//生產(chǎn)者線程
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)
{
//生產(chǎn)一件產(chǎn)品
p=(PPRODUCT)HeapAlloc(GetProcessHeap()?HEAP_ZERO_MEMORYsizeof(PRODUCT));
p->_ProductId=GetTickCount();//產(chǎn)品編號為
p->dwThreadId=*pData;
WaitForSingleobject(hEmptyINFINITE);//P操作
WaitForSingleobject(hMutexINFINITE);//P操作
buffer[in]=p;
StringCchPrintf(msgBuf?BUF_SIZE?TEXT(“線程%ld?生產(chǎn)一件產(chǎn)品,產(chǎn)品編號為%d加入到緩沖區(qū)中的第%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));//線程暫停一會,也是為了模擬生產(chǎn)過程的不確定性
}
????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實現(xiàn)小波變換
- 下一篇:用c語言編寫的掃雷程序
評論
共有 條評論