资源简介

以生产者消费者模型为基础,在Windows环境下创建一个控制台进程,在该进程中创建读者写者线程模拟生产者和消费者。写者线程写入数据,然后将数据放置在一个空缓冲区中供读者线程读取。读者线程从缓冲区中获得数据,然后释放缓冲区。当写者线程写入数据时,如果没有空缓冲区可用,那么写者线程必须等待读者线程释放出一个空缓冲区。当读者线程读取数据时,如果没有满的缓冲区,那么读入线程将被阻塞,直到新的数据被写进去。

资源截图

代码片段和文件信息

#include “windows.h“
#include 
#include 
#include 

const unsigned short    size_of_buffer = 1; //缓冲区长度不能是10,为了满足读者全读完了写者才能写的要求
 short WriteID = 1;
 short ReadID = 1;
 short in = 0; //产品进缓冲区时的缓冲区下标
 short out = 0; //产品出缓冲区时的缓冲区下标

int gData[  size_of_buffer];//缓冲区是个循环队列
bool continu = true;  //控制程序结束
HANDLE g_hMutex; //用于线程间的互斥
HANDLE g_hFullSemaphore;//当缓冲区满时使写者等待
HANDLE g_hEmptySemaphore;//当缓冲区空时使读者等待

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 << “ 写者 “ << tNo+1 << “ 写 “ << WriteID << “ 成功 \n “ << endl;
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 << “ 读者 “<< tNo+1 << “ 读 “ << ReadID << “ 成功 \n“ << endl;
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(){
//创建各个互斥信号
    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; //写者的个数
    const unsigned short READER_COUNT = 3; //读者的个数

const unsigned short THREADS_COUNT = WRITER_COUNT + READER_COUNT; //线程总数

HANDLE hThreads[THREADS_COUNT]; //各线程的handle
    DWORD writerID[WRITER_COUNT]; //写者线程的标识符
    DWORD readerID[READER_COUNT]; //读者线程的标识符

//创建写者线程
INTEGER* tmpInt;
    for (int i=1;i < WRITER_COUNT;i++){
tmpInt=(INTEGER*)malloc(sizeof(INTEGER));
tmpInt->data=i;
        hThreads[i]=CreateThread(NULL0WritertmpInt0&writerID[i]);
//CreateThread():在调用进程的地址空间上创建一个线程
        if (hThreads[i]==NULL)
return -1;
    }

//创建消费者线程
    for (int i=1;i < READER_COUNT;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  操作系统实验一实验报告-李旦兰\w_and_r.cpp

     文件     261632  2010-10-10 13:57  操作系统实验一实验报告-李旦兰\操作系统实验一实验报告.doc

     目录          0  2010-10-10 13:59  操作系统实验一实验报告-李旦兰

----------- ---------  ---------- -----  ----

               265045                    3


评论

共有 条评论