- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)