搜档网
当前位置:搜档网 › 读者与写者同步(写者优先) - 编程技术讨论

读者与写者同步(写者优先) - 编程技术讨论

读者与写者同步(写者优先) - 编程技术讨论 - 爱好者论坛 IT知识与信息普及网站—爱好者网站 cfan|《电脑爱好者》杂志官方论坛 - Powered by Discuz!注册
登录 首页搜索银行帮助论坛道具稀饭商城饭团绿色时尚Water_V3爱好者论坛 » 编程技术讨论 » 读者与写者同步(写者优先)
返回列表 回复 发帖

发新话题发布投票发布悬赏发布辩论发布活动发布视频发布商品topo猫 发短消息
加为好友
topo猫 当前离线
UID910833 帖子7 党派 阅读权限10 注册时间2008-12-17 最后登录2008-12-29
CFan贫民

UID910833 帖子7 精华0 积分14 现金324 cfan币0 在线时间0 小时 1楼 打印 字体大小: tT 发表于
2008-12-17 19:06 | 只看该作者 139元抢购真品apple耳机!
[C++] 读者与写者同步(写者优先)
1. 目的和要求
(1)掌握基本的同步互斥算法,理解读者写者模型。
(2)了解Windows 2000/XP中多线程的并发执行机制,线程间的同步和互斥。
(3)学习使用Windows 2000/XP中基本的同步对象,掌握相应的API。

2. 实验内容
(1)在WINDOWS 2000环境下,创建一个控制台进程,此进程包括6个线程:四个读者线程和两个写者线程。
(2)用信号量机制解决进程(线程)的同步与互斥问题。
(3)给出结果分析

3. 实验环境
WindousXP操作系统,VC++6.0操作平台。

4. 设计思路及方案
仔细学习教材上给的伪代码,书中实现了读者优先,即如果所有的读者进程没有执行完,则写者需要一直等待最后一读者释放互斥信号wmutex,若读者的数量很大,那么写者就会饥饿。为防止写者饥饿,必须允许在有读者进程的情况下写者进程能够获得CPU执行,这就是“写者优先”。

5. 实验代码及注释
#include
#include
#include

//设置信号量。
HANDLE rwmutex_Semaphore;//用rwrmutex_Semaphore表示于写者与其他读者/写者互斥的访问共享数据
HANDLE
nrmutex_Semaphore;//nrmutex_Semaphore用于写者等待已进入读者退出,所有读者退出前互斥写操作
HANDLE rmutex_Semaphore;//该信号量初始值设为4,表示最多允许4个读者进程同时进行读操作


void Reader(void )//创建读者进程
{
int readcount = 0;
for (int i=1;i<=4;i++)
{
WaitForSingleObject(rwmutex_Semaphore,-1);//读者写者互斥

WaitForSingleObject(r

mutex_Semaphore,-1);//对rmutex_Semaphore进行P操作
readcount++;
if (readcount==1)WaitForSingleObject(nrmutex_Semaphore,-1);
//有读者进入互斥写操作
ReleaseSemaphore(rwmutex_Semaphore,1,NULL);
ReleaseSemaphore(rwmutex_Semaphore,1,NULL);
// 释放读写互斥信号量,允许其它读、写进程访问资源

printf("读者准备读/n");
printf("读者开始读缓冲区中数据... /n");//读者读
printf("读者开始开始退出缓冲区... /n");

WaitForSingleObject(rmutex_Semaphore,-1);
readcount--;
if (readcount==0)ReleaseSemaphore(rwmutex_Semaphore,1,NULL);
//所有读者退出允许写更新
ReleaseSemaphore(rmutex_Semaphore,1,NULL);
//对rmutex_Semaphore进行V操作
}

return;
}
void Writer(void )//创建写者进程
{ for (int i=1;i<=2;i++)
{
WaitForSingleObject(rwmutex_Semaphore,-1);
for (int k=1;k<=4;k++)

WaitForSingleObject(rmutex_Semaphore,-1);//禁止新读者,并等待已进入的读者退出

printf("写者准备写");
printf("写者开始往缓冲区中写数据..." );//写者写
printf("写者开始退出缓冲区...");

for (int z=1;z<=4;z++)
ReleaseSemaphore(rmutex_Semaphore,1,NULL);
// 恢复允许rmutex 值为4
ReleaseSemaphore(rwmutex_Semaphore,1,NULL);
//对reader_Semaphore进行V操作
}
return ;
}


void main ()
{
HANDLE Data[2];//创建HANDLE数组Data


rwmutex_Semaphore=CreateSemaphore(NULL,0,1,NULL);//创建互斥信号量rwmutex_Semaphore

rmutex_Semaphore=CreateSemaphore(NULL,0,1,NULL);//创建互斥信号量rmutex_Semaphore
nrmutex_Semaphore=CreateSemaphore(NULL,1,1,NULL);

HANDLE handle[2];//创建HANDLE数组handle
//以下是创建生产着和读者进程


handle[0]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Writer),&Data[0],0,NULL);
if (handle[0]==NULL)printf("创建写者线程失败 \n");


handle[1]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Reader),&Data[1],0,NULL);
if (handle[1]==NULL)printf("创建读者线程失败 \n");

return;
}
6.取得结果

行代码后结果如下:
写者准备写
写者开始往缓冲区中写数据...
写者开始退出缓冲区...

读者准备读
读者开始读缓冲区中读数据...
读者开始退出缓冲区...

写者准备写
写者开始往缓冲区中写数据...
写者开始退出缓冲区...

读者准备读
读者开始读缓冲区中读数据...
读者开始退出缓冲区...

读者准备读
读者开始读缓冲区中读数据...
读者开始退出缓冲区...

读者准备读
读者开始读缓冲区中读数据...
读者开始退出缓冲区...

7.总结与体会
错误:试验中,信号量PV操作不当导致整个程序出现多出错误
解决办法:参照教材读者优先,改正错误
体会收获:通过这个实验,加深了对同步和互斥问题的了解,用同步互斥问题解决读者和写者问题,实现写者优先。
8.参考文献
1、计算机操作系统
2、MSDN

收藏 分享 评分

回复 引用 订阅 TOP


小伟的小伟 发短消息
加为好友
小伟的小伟 (小伟的小伟)当前离线
用户禁止访问
UID135750 帖子3848 党派 阅读权限150 注册时间2005-2-26 最后登录2009-7-15
荣誉版主

UID135750 帖子3848 精华0 积分7700 现金191 cfan币0 性别男 来自广西南宁市 在线时间580 小时 2楼 发表于
2008-12-19 12:03 | 只看该作者 :m34: :m34:

我一般都是用事件的撒~
小伟的Blog0GiNr Studio


回复 引用 TOP



返回列表

CFan_热点推荐
新闻拌饭
饭团活动专区
获奖名单
晒晒奖品
意见箱
英特尔25周年——稀饭闲话
CFan_系统与软件
操作系统
Windows 7专区
Windows XP美化专区
启动技术讨论区
网络世界
网站建设
安全技术讨论
病毒援助区
防火墙及HIPS交流区
杀毒软件讨论区
图形图像
教程作品区
资源分享区
软件交流
办公软件交流区
办公软件下载共享专区
精品软件下载
编程技术讨论
CFan_数码与硬件
硬件天地
硬件学堂
硬件资讯区
DIY攒机配置交流
网淘硬件
手机公社
手机诊所
手机软件区
手机导购区
数码部落
数码相机导购区
数码相机资源区
笔记本俱乐部
询价专区
上网本专区
无线上网讨论
CFan_饭团娱乐区
水煮(谁主)稀饭?
红包发放专区
稀饭会员相册

稀饭有声区
生活图秀
情感驿站
网络小说专区
酷影炫音
游戏迷公会
游戏下载区
BT游戏资源
游戏讨论区
体坛风云
CFan_官方商城
CFan大卖场
活动区
晒单区
建议、咨询区
饭团 稀饭网团购
我想要
晒单区
饭团答疑
CFan_杂志相关
《电脑爱好者》读编交流区
《电脑爱好者》普及版读编交流区
CFan特约栏目:IT讲师培训营
CFan_版务管理
稀饭建议、举报、投诉、版主申请区
精华及授勋区
会员投诉区

许愿池 社区银行 感谢曾经的版主
爱好者网站 ( 京ICP证010182号)|联系我们 |Archiver|WAP
GMT+8, 2010-11-27 19:30. Powered by Discuz! 7.0.0
© 2001-2009 Comsenz Inc.

相关主题