資源簡介
以生產者消費者模型為基礎,在Windows環(huán)境下創(chuàng)建一個控制臺進程,在該進程中創(chuàng)建讀者寫者線程模擬生產者和消費者。寫者線程寫入數(shù)據(jù),然后將數(shù)據(jù)放置在一個空緩沖區(qū)中供讀者線程讀取。讀者線程從緩沖區(qū)中獲得數(shù)據(jù),然后釋放緩沖區(qū)。當寫者線程寫入數(shù)據(jù)時,如果沒有空緩沖區(qū)可用,那么寫者線程必須等待讀者線程釋放出一個空緩沖區(qū)。當讀者線程讀取數(shù)據(jù)時,如果沒有滿的緩沖區(qū),那么讀入線程將被阻塞,直到新的數(shù)據(jù)被寫進去。

代碼片段和文件信息
#include?“windows.h“
#include?
#include?
#include?
const?unsigned?short????size_of_buffer?=?1;?//緩沖區(qū)長度不能是10,為了滿足讀者全讀完了寫者才能寫的要求
?short?WriteID?=?1;
?short?ReadID?=?1;
?short?in?=?0; //產品進緩沖區(qū)時的緩沖區(qū)下標
?short?out?=?0; //產品出緩沖區(qū)時的緩沖區(qū)下標
int?gData[??size_of_buffer];//緩沖區(qū)是個循環(huán)隊列
bool?continu?=?true;??//控制程序結束
HANDLE?g_hMutex; //用于線程間的互斥
HANDLE?g_hFullSemaphore;//當緩沖區(qū)滿時使寫者等待
HANDLE?g_hEmptySemaphore;//當緩沖區(qū)空時使讀者等待
double?eRandom(int?upLimit);
typedef?struct
{ int?data;
}INTEGER;
//寫者
DWORD?WINAPI?Writer(LPVOID?lppara)
{
????while(continu){
????????WaitForSingleobject(g_hFullSemaphoreINFINITE);//可在指定時間內等待指定對象為可用
????????WaitForSingleobject(g_hMutexINFINITE);
int?tNo=((INTEGER*)lppara)->data;
????????if(WriteID?<=?10){
//cout?<“?寫者?“?< printf(“?寫者?%d?寫入?%d??\n“tNo+1WriteID);
gData[in]?=?WriteID;
in?=?(in+1)%??size_of_buffer;
WriteID++;
}else?return?-1;
???????int?sleepTime=20*(int)eRandom(50+tNo);
???Sleep(sleepTime);
????????ReleaseMutex(g_hMutex);
????????ReleaseSemaphore(g_hEmptySemaphore1NULL);
????}
????return?0;
}
//讀者
DWORD?WINAPI?Reader(LPVOID?lppara)
{
????while(continu){
????????WaitForSingleobject(g_hEmptySemaphoreINFINITE);
????????WaitForSingleobject(g_hMutexINFINITE);
int?tNo=((INTEGER*)lppara)->data;
????????ReadID?=?gData[out];
out?=?(out+1)%??size_of_buffer;
//cout?<“?讀者?“< printf(“?讀者?%d?讀取?%d??\n“tNo+1ReadID);
???????int?sleepTime=10*(int)eRandom(50+tNo);
Sleep(sleepTime);
????????ReleaseMutex(g_hMutex);
????????ReleaseSemaphore(g_hFullSemaphore1NULL);
????}
????return?0;
}
int?main(){
//創(chuàng)建各個互斥信號
????g_hMutex?=?CreateMutex(NULLFALSENULL);
????g_hFullSemaphore?=?CreateSemaphore(NULL??size_of_buffer??size_of_bufferNULL);
????g_hEmptySemaphore?=?CreateSemaphore(NULL0??size_of_bufferNULL);
const?unsigned?short?WRITER_COUNT?=?5; //寫者的個數(shù)
????const?unsigned?short?READER_COUNT?=?3; //讀者的個數(shù)
const?unsigned?short?THREADS_COUNT?=?WRITER_COUNT?+?READER_COUNT; //線程總數(shù)
HANDLE?hThreads[THREADS_COUNT]; //各線程的handle
????DWORD?writerID[WRITER_COUNT]; //寫者線程的標識符
????DWORD?readerID[READER_COUNT]; //讀者線程的標識符
//創(chuàng)建寫者線程
INTEGER*?tmpInt;
????for?(int?i=1;i? tmpInt=(INTEGER*)malloc(sizeof(INTEGER));
tmpInt->data=i;
????????hThreads[i]=CreateThread(NULL0WritertmpInt0&writerID[i]);
//CreateThread():在調用進程的地址空間上創(chuàng)建一個線程
????????if?(hThreads[i]==NULL)
return?-1;
????}
//創(chuàng)建消費者線程
????for?(int?i=1;i? tmpInt=(INTEGER*)malloc(sizeof(INTEGER));
tmpInt->data=i;
????????hThreads[WRITER_COUNT+i]=CreateThread(NULL0ReadertmpInt0&readerID[i]);
????????if?(hThreads[i]==NULL)
return?-1;
????}
while(continu){
????????if(getchar()){?
//按回車后終止程序運行
????????????continu?=?false;
????????}
????}
????re
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????3413??2010-10-09?22:03??操作系統(tǒng)實驗一實驗報告-李旦蘭\w_and_r.cpp
?????文件?????261632??2010-10-10?13:57??操作系統(tǒng)實驗一實驗報告-李旦蘭\操作系統(tǒng)實驗一實驗報告.doc
?????目錄??????????0??2010-10-10?13:59??操作系統(tǒng)實驗一實驗報告-李旦蘭
-----------?---------??----------?-----??----
???????????????265045????????????????????3
評論
共有 條評論