資源簡介
通過3個進程,3個緩沖隊列,模擬緩沖池輸入、計算、輸出的過程。
代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
DWORD??WINAPI?Thread1(LPVOID?lpPara);?//線程1
DWORD??WINAPI?Thread2(LPVOID?lpPara);?//線程2
DWORD??WINAPI?Thread3(LPVOID?lpPara);?//線程1
HANDLE?MS[3];????//互斥信號?
HANDLE?RS[3]; ?//同步信號?
struct?Buffer
{
int?BufNo;???????????//緩沖區號
int?buf;?????????????//緩沖區內容
Buffer?*next;????????//下一個緩沖區的指針
};
class?BufferQueue????????//緩沖隊列類?
{
public:
BufferQueue();?
~BufferQueue();
bool?isEmpty();?
void?enqueue(int?nint?x=-1);????//入隊?
Buffer?*dequeue();???????????????//出隊???
private:
Buffer?*front*rear;?
};
BufferQueue::BufferQueue()????????//構造?
{
front=rear=NULL;
}
BufferQueue::~BufferQueue()???????//析構?
{
Buffer?*q=front*p;
while(q!=NULL)
{
p=q;
q=q->next;
delete?p;
}
front=rear=NULL;
} ?
bool?BufferQueue::isEmpty()?????//判斷是否空隊列?
{
return?front==NULL&&rear==NULL;
}?
void?BufferQueue::enqueue(int?nint?x)?????//入隊?????
{
Buffer?*q=new?Buffer;
if(x!=-1)? ?//插入非空緩沖區
q->buf=x; ??????
q->BufNo=n;??????????//緩沖區序號
if(isEmpty())????????????//空隊列插入??????
front=q;?
else
? rear->next=q;?????????//列尾插入
rear=q;
}
Buffer?*BufferQueue::dequeue()???????//出隊?
{
Buffer?*q=front;
front=front->next;
if(front==NULL)?????//空隊列時,首尾同步?
rear=NULL;?
return?q;
}
BufferQueue?empinqoutq;???//3個緩沖隊列?
Buffer*?takeBuf(int?type);???//從type類型緩沖隊列頭取出一個緩沖區
void?addBuf(int?typeBuffer*?buffer);??//將buffer插入type類型隊列尾
Buffer*?getBuf(int?type);??????//包含了同步和互斥控制的takeBuf操作
void?putBuf(int?type?Buffer*?buffer);??//包含了同步和互斥控制的addBuf操作
enum?type{emptyinputoutput};???//類型
?
int?main()
{
DWORD?ThreadId1?ThreadId2ThreadId3;
for(int?a=0;a<20;a++)???????????????????//假設20個緩沖區?
emp.enqueue(a);
for(int?a=0;a<3;a++) ??????????//3個互斥信號?
MS[a]=CreateMutex(NULLFALSE“qemtx“);??
RS[0]=CreateSemaphore(NULL2020 “esp“); ???????//3個同步信號?
RS[1]=RS[2]=CreateSemaphore(NULL020 “iosp“);
HANDLE?ithread?=?CreateThread(NULL0Thread1NULL0&ThreadId1);
HANDLE?cthread?=?CreateThread(NULL0Thread2NULL0&ThreadId1);
HANDLE?othread?=
- 上一篇:c語言編寫的超級瑪麗
- 下一篇:c++ 連接sql server 數據庫代碼
評論
共有 條評論