资源简介
以生产者消费者模型为基础,在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
相关资源
- HOOK小工具(进程、窗口、全局)
- 直观端口查看器,详细显示可疑进程
- 内核驱动进程保护演示程序
- 曼彻斯特编解码_同步QuartusII工程
- HOOK 记录和模拟 Keyboard Mouse
- linux下用多进程同步方法解决生产者
- 线程同步机制-AutoResetEvent
- 用FileSystemWatcher控件实现文件同步更新
- 进程的管道通信编制一段程序,实现
- 解决WPE进不了游戏的最佳方法(闭屏
- 易语言:隐藏进程
- HP磁盘备份方案:让数据备份与业务应
- 飞康CDP让两岸数据库即时同步
- 意天Windows助手(进程强杀/进程守护
- 参数在线估算的永磁同步电机最大转
- 让程序禁止结束进程并提示拒绝访问
- 静止同步补偿器(STATCOM)综述
- 基于RBF神经网络在线辨识的永磁同步
- EMC解决方案助交行实现业务大集中同
- 中国银行集中化建设进程启示
- 基于模糊PI的低速表贴式永磁同步电机
- 文件时间戳记同步(更改)工具
- FreeFileSync 免费文件同步 v10.19 Windows版
- 基于DSP的矿井提升机永磁同步电机D
- 目前找到最好用的文件同步软件
- emd分解端点效应论文及改进程序
- 撸大师死灰复燃SDK,可常驻后台运行
- 一种基于定子电压相角控制的永磁同
- 达梦DM产品白皮书包含共享集群,交换
- 单反相机的JPG和RAW文件同步删除
评论
共有 条评论