资源简介
以生产者消费者模型为基础,在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
相关资源
- 多进程cpu调度仿真
- GPS的授时原理及应用
- 进程的管道通信 实验报告
- 进程调度模拟设计—时间片轮转、非
- 时间片轮转、最高响应比优先调度算
- 进程调度模拟设计——先来先服务、
- nachos实验二 线程与同步
- CFS调度算法 详细解析
- 进程管理模拟系统
- wpe防屏蔽版修改了进程名称的
- 多级反馈进程调度算法 实验报告 及程
- 实时监控目录文件夹的更新状态,与
- 操作系统——司机和售票员进程同步
- 进程隐藏工具HideApp
- 进程同步读者写者问题
- 利用PLL估算器和弱磁技术FW实现永磁同
- 用多线程同步方法解决哲学家就餐问
- ★毕业论文\\文献\\_10kvar静止同步补偿
- 预防进程死锁的银行家算法
- ISTask.dll
- 数电课程设计十三进制同步减法计数
- windows下监控并重启某个进程
- 数据库超强同步软件(绿色版)
- 通达OA单点登录模块及密码同步模块(
- 支持并发的多人聊天程序
- 封装CopyFileEx复制文件,提供同步、异
- 同步中的相位估计方法
- Win7进程注入绕UAC源码
- 永磁同步电机的积分滑模控制(使用
- 煤气化废水短程同步脱氮试验研究
评论
共有 条评论