任务4-同步对象解决有限缓冲区问题.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
任务4-同步对象解决有限缓冲区问题

基本信息 实践题目:同步对象解决有限缓冲区问题 完成人: 班级姓名:陈杨 学号:0706230101 报告日期 :2011年1月6日 实践内容简要描述 实践目标 1.掌握Win32提供的同步对象的使用方法 2. 理解有限缓冲区问题并用同步对象解决该问题 实践内容 用Win32提供的同步对象解决有限缓冲区问题 写一个多线程实现C/C++程序:一些线程负责找出某个数据范围的素数,并放到一个数组中,另一些线程负责将数组中的素数按次序取出,并显示出来。 要求定义一个全局变量的数组:int prime[9] 用于存放找到的待显示的素数,要理解成“环形缓冲区”。 测试数据示例: 1 W 10 100 2 W 1 10 3 D 3 0 说明:每行四个元素:第一个是线程ID;第二个是线程角色(D——显示结果线程,W——找素数线程);若是显示结果线程,则第三个数字表示该线程需要显示的素数个数,第四个数始终为零;若是找素数线程,则第三,第四个数表示找素数的范围。 要求使用“生产者-消费者”算法,找素数线程每次只能放入一个素数,显示线程每次只能取一个素数。 设计思路 程序分成两个层,数据层和表示层: 数据层负责对缓冲区的处理,包括放数据和取数据,并实现同步互斥机制 表示层调用数据层提供的功能,并负责显示结果 线程方面,首先创建主线程,主线程负责初始化数据层,并创建读写子线程。子线程各司其职,调用数据层的功能,或放数据,或取数据。 主要数据结构 #define BUFFER_LENGTH 9 int prime[BUFFER_LENGTH]; int begIndex; int endIndex; HANDLE emptySemaphore; HANDLE fullSemaphore; CRITICAL_SECTION writerCS; CRITICAL_SECTION readerCS; int readerCount; int writerCount; CRITICAL_SECTION readerCountCS; CRITICAL_SECTION writerCountCS; CRITICAL_SECTION consoleOwnerCS; // threads related struct MyThread { int id; HANDLE hThead; DWORD dwThread; MyThread* next; }; MyThread* head; // thread functions struct FindParam { int start; int end; }; struct DisplayParam { int count; int threadId; }; 主要代码结构及分析 int main() { ifstream fin(ex4.dat); if(!fin) { cout Cannot find file \ex4.dat\.\nPress any key to exit.; _getch(); return 1; } initBuf(); head = NULL; MyThread* p = head; while(!fin.eof()) { MyThread* pp = new MyThread; fin pp-id; char type; fin type; if(type == D) { DisplayParam* dp = new DisplayParam; fin dp-count; dp-threadId = pp-id; while(!fin.eof() fin.get() != \n); pp-hThead = CreateThread(NULL, 0, display, dp, 0, pp-dwThread); } else if(type == W) { FindParam* fp = new FindParam; fin fp-start; fin fp-end; while(!fin.eof() fin.get() != \n); pp-hThead = CreateThread(NULL, 0, findPrime, fp, 0, pp-dwThread); } else { cout Error thread type.\n; while(!fin.eof() fin.get() != \n); continue; } pp-next = NULL; if(

文档评论(0)

qwd513620855 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档