计算机软件基础太原科技大学实验五.docx

上传人:b****2 文档编号:391448 上传时间:2022-10-09 格式:DOCX 页数:8 大小:144.82KB
下载 相关 举报
计算机软件基础太原科技大学实验五.docx_第1页
第1页 / 共8页
计算机软件基础太原科技大学实验五.docx_第2页
第2页 / 共8页
计算机软件基础太原科技大学实验五.docx_第3页
第3页 / 共8页
计算机软件基础太原科技大学实验五.docx_第4页
第4页 / 共8页
计算机软件基础太原科技大学实验五.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

计算机软件基础太原科技大学实验五.docx

《计算机软件基础太原科技大学实验五.docx》由会员分享,可在线阅读,更多相关《计算机软件基础太原科技大学实验五.docx(8页珍藏版)》请在冰豆网上搜索。

计算机软件基础太原科技大学实验五.docx

软件开发技术实验指导书

《软件开发技术基础》

实验报告

学院:

电子信息工程学院__

班级:

电子131502____

学号:

姓名:

实验五Windows操作系统并发多线程的应用(2学时)

班级电子131502学号201315020232姓名许鹏

第15周星期五第3、4节成绩______

实验类型:

验证性

实验要求:

必修

实验学时:

2学时

一、实验目的:

加深对Windows线程概念及线程同步管理各部门内容的理解;熟悉Windows线程管理API的使用。

二、实验要求:

1、通过上网查阅资料,了解Windows线程同步函数,写出常用的API函数的定义;

2、阅读案例程序,给出程序的详细注解;

3、运行程序,分析程序结果;

4、改写程序实现要求见(四)。

三、实验内容:

以下程序实现多线程同步,其关系如下:

父亲、儿子、女儿三人和一个盘子,当盘子空时,父亲往盘中随机放苹果或香蕉,儿子只从盘中拿桔子,女儿只从盘中拿苹果。

四、要求:

1)改写程序,要求为:

母亲往盘中随机放苹果或桔子,儿子只从盘中拿苹果,女儿只从盘中拿桔子

2)写出完整的程序并能调试通过即可

五、实验原理:

调用Win32API中的CreateThread函数创建线程。

CreateThread(NULL,0,&TEventWindow:

:

ThreadFunc,this,0,&hThreadId);第一个参数设定线程的安全属性,因其仅用于WindowsNT,故不设定。

第二个参数为0指定线程使用缺省的堆栈大小。

第三个参数指定线程函数,线程即从该函数的入口处开始运行,函数返回时就意味着线程终止运行。

第四个参数为线程函数的参数,可以是指向任意数据类型的指针。

第五个参数设定线程的生成标志。

hThreadId存放线程的标识号。

线程函数如下定义,上述的this参数是指向线程所属窗口的句柄指针,通过thrdWin参数传送过来,利用这个指针再调用相应的LoopFunc函数,线程的具体事务都在这个函数中执行。

WaitForSingleObject(hThread,2000)windows里面的线程同步的api就是让你这个线程或者说程序停在那里,等别的程序通知你或者说发一个信号量等,然后这个程序在继续运行下去。

CloseHandle函数为关闭一个内核对象。

其中包括文件、文件映射、进程、线程、安全和同步对象等。

在CreateThread成功之后会返回一个hThread的handle,且内核对象的计数加1,CloseHandle之后,引用计数减1,当变为0时,系统删除内核对象。

ReleaseSemaphore函数用于对指定的信号量增加指定的值;sleep函数可计算执行挂起的时间;rand函数在产生随机数srand(time(NULL)),可以为rand函数提供不同的种子值,进而产生不同的随机数序列。

六、程序代码:

(1)苹果香蕉问题:

#include

usingnamespacestd;

#include

#include

intk;

HANDLEApple_;CRITICAL_SECTIONmmutex;

HANDLEBanana_;

DWORDWINAPISon(LPVOIDn)

{//HANDLEApple_;CRITICAL_SECTIONmmutex;

inti=1;

//:

:

OpenSemaphore(MUTEX_ALL_ACCESS,false,"Apple_");

while

(1)

{:

:

WaitForSingleObject(Apple_,INFINITE);//等苹果

cout<<"Soneats"<

LeaveCriticalSection(&mmutex);

i++;

}

:

:

CloseHandle(Apple_);

return0;

}

DWORDWINAPIDaughter(LPVOIDn)

{

inti=1;//HANDLEBanana_;CRITICAL_SECTIONmmutex;

//OpenSemaphore(MUTEX_ALL_ACCESS,false,"Banana_");

while

(1)

{

:

:

WaitForSingleObject(Banana_,INFINITE);//等香蕉

cout<<"Daughtereats"<

LeaveCriticalSection(&mmutex);

i++;

}

:

:

CloseHandle(Banana_);

return0;

}

DWORDWINAPIFather(LPVOIDn)

{UINTfruit;//CRITICAL_SECTIONmmutex;

EnterCriticalSection(&mmutex);

srand(GetTickCount());

fruit=rand()%2;

if(fruit==0)

{//盘中放入苹果

cout<

k=k+1;

:

:

ReleaseSemaphore(Apple_,1,NULL);

}

else

{//盘中放香蕉

cout<

k=k+1;

:

:

ReleaseSemaphore(Banana_,1,NULL);

}

return0;

}

intmain()

{

intj;

k=0;

HANDLEFather_[20];

Apple_=:

:

CreateSemaphore(NULL,0,1,"apple");

Banana_=:

:

CreateSemaphore(NULL,0,1,"banana");

InitializeCriticalSection(&mmutex);

for(j=0;j<20;j++)

{

Father_[j]=:

:

CreateThread(NULL,0,Father,NULL,0,0);

}

:

:

CreateThread(NULL,0,Son,NULL,0,0);

:

:

CreateThread(NULL,0,Daughter,NULL,0,0);

Sleep(1000);

WaitForMultipleObjects(20,Father_,TRUE,INFINITE);

return0;

}

(2)苹果桔子问题:

#include

usingnamespacestd;

#include

#include

intk;

HANDLEApple_;HANDLEOrange_;

CRITICAL_SECTIONmmutex;

DWORDWINAPISon(LPVOIDn)

{//HANDLEOrange_;CRITICAL_SECTIONmmutex;

inti=1;

OpenSemaphore(MUTEX_ALL_ACCESS,false,"Orange_");

while

(1)

{

:

:

WaitForSingleObject(Orange_,INFINITE);//等桔子

cout<<"Soneats"<

LeaveCriticalSection(&mmutex);

i++;

}

:

:

CloseHandle(Apple_);

return0;

}

DWORDWINAPIDaughter(LPVOIDn)

{

inti=1;//HANDLEApple_;CRITICAL_SECTIONmmutex;

OpenSemaphore(MUTEX_ALL_ACCESS,false,"Apple_");

while

(1)

{

:

:

WaitForSingleObject(Apple_,INFINITE);//等苹果

cout<<"Daughtereats"<

LeaveCriticalSection(&mmutex);

i++;

}

:

:

CloseHandle(Apple_);

return0;

}

DWORDWINAPIMather(LPVOIDn)

{

UINTfruit;//CRITICAL_SECTIONmmutex;

EnterCriticalSection(&mmutex);

srand(GetTickCount());

fruit=rand()%2;

if(fruit==0)

{

//盘中放入苹果

cout<

k=k+1;

:

:

ReleaseSemaphore(Apple_,1,NULL);

}

else{//盘中放入桔子

cout<

k=k+1;

:

:

ReleaseSemaphore(Orange_,1,NULL);

}

return0;

}

intmain()

{

intj;

k=0;

HANDLEMather_[20];

Apple_=:

:

CreateSemaphore(NULL,0,1,"apple");

Orange_=:

:

CreateSemaphore(NULL,0,1,"orange");

InitializeCriticalSection(&mmutex);

for(j=0;j<20;j++)

{

Mather_[j]=:

:

CreateThread(NULL,0,Mather,NULL,0,0);

}

:

:

CreateThread(NULL,0,Son,NULL,0,0);

:

:

CreateThread(NULL,0,Daughter,NULL,0,0);

Sleep(1000);

WaitForMultipleObjects(20,Mather_,TRUE,INFINITE);

return0;

}

七、实验结果

第8页共8页

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1