A操作系统课程设计Word格式.docx

上传人:b****4 文档编号:6228764 上传时间:2023-05-06 格式:DOCX 页数:26 大小:137.19KB
下载 相关 举报
A操作系统课程设计Word格式.docx_第1页
第1页 / 共26页
A操作系统课程设计Word格式.docx_第2页
第2页 / 共26页
A操作系统课程设计Word格式.docx_第3页
第3页 / 共26页
A操作系统课程设计Word格式.docx_第4页
第4页 / 共26页
A操作系统课程设计Word格式.docx_第5页
第5页 / 共26页
A操作系统课程设计Word格式.docx_第6页
第6页 / 共26页
A操作系统课程设计Word格式.docx_第7页
第7页 / 共26页
A操作系统课程设计Word格式.docx_第8页
第8页 / 共26页
A操作系统课程设计Word格式.docx_第9页
第9页 / 共26页
A操作系统课程设计Word格式.docx_第10页
第10页 / 共26页
A操作系统课程设计Word格式.docx_第11页
第11页 / 共26页
A操作系统课程设计Word格式.docx_第12页
第12页 / 共26页
A操作系统课程设计Word格式.docx_第13页
第13页 / 共26页
A操作系统课程设计Word格式.docx_第14页
第14页 / 共26页
A操作系统课程设计Word格式.docx_第15页
第15页 / 共26页
A操作系统课程设计Word格式.docx_第16页
第16页 / 共26页
A操作系统课程设计Word格式.docx_第17页
第17页 / 共26页
A操作系统课程设计Word格式.docx_第18页
第18页 / 共26页
A操作系统课程设计Word格式.docx_第19页
第19页 / 共26页
A操作系统课程设计Word格式.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

A操作系统课程设计Word格式.docx

《A操作系统课程设计Word格式.docx》由会员分享,可在线阅读,更多相关《A操作系统课程设计Word格式.docx(26页珍藏版)》请在冰点文库上搜索。

A操作系统课程设计Word格式.docx

设计一个多道程序完成上述操作。

 

图1Buffer操作

(1)可以随机产生字符数据,由put操作放入Buff1,buffer中容量单位是字符。

(2)提供良好图形界面,显示Buffer的操作过程。

(3)可以设定各Buffer的容量、PUT、GET、Move操作的个数;

(4)可以设定PUT、GET、Move操作的速度;

(5)实时显示每个Buffer中数据的个数和数据的内容,空闲Buffer的空间的个数;

(6)实时显示线程、进程所处于等待(阻塞)状态的个数

(7)程序运行结束,显示汇总数据:

总的运行时间;

Buffer中数据的个数;

已放入BUFFER的数据个数;

已放已取的数据个数;

平均每个buffer中的数据个数。

1.3课程设计使用的开发语言和工具

语言:

C++

开发环境:

VisualStudio2008及其开发环境下的MFC平台。

1.4解决的主要问题

(1)MFC界面设计

(2)模拟生产者消费者的互斥操作

(3)各信号量的使用

2使用的基本概念和原理

2.1MFC

MFC是Windows下程序设计的最流行的一个类库,它合理的封装了WIN32API函数,并设计了一套方便的消息映射机制。

2.2MFC的消息实现机制

在MFC的框架结构下,可以进行消息处理的类的头文件里面都会含有DECLARE_MESSAGE_MAP()宏,这里主要进行消息映射和消息处理函数的声明。

所有能够进行消息处理的类都是基于CCmdTarget类的,也就是说CCmdTarget类是所有可以进行消息处理类的父类。

CCmdTarget类是MFC处理命令消息的基础和核心。

2.3线程

线程是程序独立运行的基本单位,一个程序通过执行多个线程可以提高机器本身资源的利用率,同时也可以完成多任务并行运行的操作。

2.4信号量

信号量是一个在一定范围内变化的整形数据,用来表示一种临界资源,线程通过信号量的值来确定自己的状态是执行还是挂起,各线程间也是通过信号量机制来协调运行顺序一起完成任务。

3总体设计

确定基本技术路线为面向对象程序设计,使用MFC编写程序,建立基本对话框。

在对话框中设立生产者、MOVE、消费者板块,各板块内的按钮能控制各自线程的建立、暂停以及相关数据的设定。

通过创建生产者线程往BUFFER1中投放随机产生的字符,创建MOVE1线程将BUFFER1中的字符移动到BUFFER2中,创建MOVE2线程将BUFFER2中的字符移动到BUFFER3中,创建消费者线程从BUFFER3中取出字符消费。

建立信号量,因为生产者线程和MOVE1线程共同使用临界资源BUFFER1,所以用Mutex信号量来协调生产者线程和MOVE1线程;

因为MOVE1线程和MOVE2线程共同使用临界资源BUFFER2,所以用Mutex1信号量来协调MOVE1线程和MOVE2线程,因为MOVE2线程和消费者线程共同使用临界资源BUFFER3,所以用Mutex3信号量来协调MOVE2线程和消费者线程。

4详细设计

4.1ThreadInfo结构体

typedefstructThreadInfo{

CListBox*pList;

}thread,*lpthread;

此结构体用来保存在线程建立时往线程中传送的参数信息(如该线程指定的操作控件),以供在本线程中使用。

4.2线程操作函数

4.2.1执行函数的声明

分别声明生产者、MOVE1、MOVE2、消费者函数,格式为:

DWORDWINAPIthreadFIFO(LPVOIDlparam);

//声明3个不同的生产者线程,主要区别是能分别输出该生产的字符是哪个生产者生产的。

DWORDWINAPIProductor1(LPVOIDpthread)

DWORDWINAPIProductor2(LPVOIDpthread)

DWORDWINAPIProductor3(LPVOIDpthread)

//声明MOVE1线程。

DWORDWINAPIMove1(LPVOIDpthread)

//声明MOVE2线程。

DWORDWINAPIMove2(LPVOIDpthread)

//声明3个不同的消费者线程,主要区别是能分别输出该消费的字符是哪个消费者消费的。

DWORDWINAPIConsumer1(LPVOIDpthread)

DWORDWINAPIConsumer2(LPVOIDpthread)

DWORDWINAPIConsumer3(LPVOIDpthread)

4.2.2定义12个线程

//3个生产者线程

hThread1=CreateThread(NULL,0,Productor1,&

thread1,0,&

ProducterID);

hThread2=CreateThread(NULL,0,Productor2,&

hThread7=CreateThread(NULL,0,Productor3,&

//3个MOVE1线程

hThread5=CreateThread(NULL,0,Move1,&

thread3,0,&

MoveID[0]);

hThread9=CreateThread(NULL,0,Move1,&

hThread10=CreateThread(NULL,0,Move1,&

//3个MOVE2线程

hThread6=CreateThread(NULL,0,Move2,&

thread4,0,&

MoveID[1]);

hThread11=CreateThread(NULL,0,Move2,&

hThread12=CreateThread(NULL,0,Move2,&

4.2.3各信号量的定义

Mutex=CreateMutex(NULL,false,NULL);

Mutex1=CreateMutex(NULL,false,NULL);

Mutex2=CreateMutex(NULL,false,NULL);

BufferFull=CreateSemaphore(NULL,BUFFER_SIZE1,BUFFER_SIZE1,NULL);

BufferEmpty=CreateSemaphore(NULL,0,BUFFER_SIZE1,NULL);

/

Buffer1Full=CreateSemaphore(NULL,BUFFER_SIZE1,BUFFER_SIZE1,NULL);

Buffer1Empty=CreateSemaphore(NULL,0,BUFFER_SIZE1,NULL);

Buffer2Full=CreateSemaphore(NULL,BUFFER_SIZE1,BUFFER_SIZE1,NULL);

Buffer2Empty=CreateSemaphore(NULL,0,BUFFER_SIZE1,NULL);

4.2.4各线程的函数接口的定义及算法描述

生产者线程函数接口:

DWORDWINAPIProductor1(LPVOIDpthread)

{

lpthreadtemp=(lpthread)pthread;

CStringstr=_T("

生产者:

"

);

while(control){

WaitForSingleObject(BufferFull,INFINITE);

WaitForSingleObject(Mutex,INFINITE);

buffer[in%BUFFER_SIZE1]=(char)('

Z'

-rand()%26);

temp->

pList->

AddString(str+buffer[in%BUFFER_SIZE1]);

c_Buffer.AddString(buffer[in%BUFFER_SIZE1]);

in=in+1;

Sleep(t1);

ReleaseMutex(Mutex);

ReleaseSemaphore(BufferEmpty,1,NULL);

}

returntrue;

}

MOVE1线程函数接口:

intflag;

while(control){WaitForSingleObject(BufferEmpty,INFINITE);

WaitForSingleObject(Buffer1Full,INFINITE);

WaitForSingleObject(Mutex,INFINITE);

WaitForSingleObject(Mutex1,INFINITE);

buffer1[mov1%BUFFER_SIZE1]=buffer[mov1%BUFFER_SIZE1];

temp->

AddString(str+buffer1[mov1%BUFFER_SIZE1]);

flag=c_Buffer.FindString(0,(LPCTSTR)buffer[mov1%BUFFER_SIZE1]);

if(flag!

=CB_ERR)

{

c_Buffer.DeleteString(flag);

}

buffer[mov1%BUFFER_SIZE1]="

0"

;

mov1=mov1+1;

Sleep(t2);

ReleaseMutex(Mutex1);

ReleaseSemaphore(BufferFull,1,NULL);

ReleaseSemaphore(Buffer1Empty,1,NULL);

}

MOVE2线程函数接口:

while(control){

WaitForSingleObject(Buffer1Empty,INFINITE);

WaitForSingleObject(Buffer2Full,INFINITE);

WaitForSingleObject(Mutex2,INFINITE);

buffer2[mov2%BUFFER_SIZE1]=buffer1[mov2%BUFFER_SIZE1];

AddString(str+buffer2[mov2%BUFFER_SIZE1]);

flag=c_Buffer1.FindString(0,(LPCTSTR)buffer1[mov2%BUFFER_SIZE1]);

c_Buffer1.DeleteString(flag);

buffer1[mov2%BUFFER_SIZE1]="

mov2=mov2+1;

ReleaseMutex(Mutex2);

ReleaseSemaphore(Buffer1Full,1,NULL);

ReleaseSemaphore(Buffer2Empty,1,NULL);

消费者线程函数的接口:

消费者:

WaitForSingleObject(Buffer2Empty,INFINITE);

AddString(str+buffer2[out%BUFFER_SIZE1]);

flag=c_Buffer2.FindString(0,(LPCTSTR)buffer2[out%BUFFER_SIZE1]);

c_Buffer2.DeleteString(flag);

buffer2[out%BUFFER_SIZE1]="

out=out+1;

Sleep(t3);

ReleaseSemaphore(Buffer2Full,1,NULL);

4.3其他辅助函数

//创建线程响应函数

voidCConsuProduThreadDlg:

:

OnCreateThread()

GetDlgItem(IDC_DESTROY_THREAD)->

EnableWindow(true);

GetDlgItem(IDC_PRODUCTOR1)->

GetDlgItem(IDC_PRODUCTOR2)->

GetDlgItem(IDC_PRODUCTOR3)->

GetDlgItem(IDC_MOVE1)->

GetDlgItem(IDC_MOVE2)->

GetDlgItem(IDC_MOVE3)->

GetDlgItem(IDC_CONSUMER1)->

GetDlgItem(IDC_CONSUMER2)->

GetDlgItem(IDC_CONSUMER3)->

GetDlgItem(IDC_CREATE_THREAD)->

EnableWindow(false);

ct1=CTime:

GetCurrentTime();

((CComboBox*)GetDlgItem(IDC_COMBO1))->

GetWindowText(buff);

control=true;

BUFFER_SIZE1=_wtoi(buff.GetBuffer());

((CEdit*)GetDlgItem(IDC_EDIT1))->

GetWindowText(T1);

t1=(_tstoi(T1))*1000;

((CEdit*)GetDlgItem(IDC_EDIT2))->

GetWindowText(T2);

t2=(_tstoi(T2))*1000;

((CEdit*)GetDlgItem(IDC_EDIT3))->

GetWindowText(T3);

t3=(_tstoi(T3))*1000;

Mutex=CreateMutex(NULL,false,NULL);

BufferFull=CreateSemaphore(NULL,BUFFER_SIZE1,BUFFER_SIZE1,NULL);

/

BufferEmpty=CreateSemaphore(NULL,0,BUFFER_SIZE1,NULL);

//结束线程响应函数

OnDestroyThread()

DWORDcode;

control=false;

intgct1,gct2,gct3,gct4,gct5,gct6,gct7,gct8,gct9,gct10,gct11,gct12;

gct1=GetExitCodeThread(hThread1,&

code);

gct2=GetExitCodeThread(hThread2,&

gct3=GetExitCodeThread(hThread3,&

gct4=GetExitCodeThread(hThread4,&

gct5=GetExitCodeThread(hThread5,&

gct6=GetExitCodeThread(hThread6,&

gct7=GetExitCodeThread(hThread7,&

gct8=GetExitCodeThread(hThread8,&

gct9=GetExitCodeThread(hThread9,&

gct10=GetExitCodeThread(hThread10,&

gct11=GetExitCodeThread(hThread11,&

gct12=GetExitCodeThread(hThread12,&

if(gct1&

&

code==STILL_ACTIVE){

TerminateThread(hThread1,0);

CloseHandle(hThread1);

if(gct2&

TerminateThread(hThread2,0);

CloseHandle(hThread2);

if(gct3&

TerminateThread(hThread3,0);

CloseHandle(hThread3);

if(gct4&

TerminateThread(hThread4,0);

CloseHandle(hThread4);

if(gct5&

TerminateThread(hThread5,0);

CloseHandle(hThread5);

if(gct6&

TerminateThread(hThread6,0);

CloseHandle(hThread6);

if(gct7&

TerminateThread(hThread7,0);

CloseHandle(hThread7);

if(gct8&

TerminateThread(hThread8,0);

CloseHandle(hThread8);

if(gct9&

TerminateThread(hThread9,0);

CloseHandle(hThread9);

if(gct10&

TerminateThread(hThread10,0);

CloseHandle(hThread10);

if(gct11&

TerminateThread(hThread11,0);

CloseHandle(hThread11);

if(gct12&

TerminateThread(hThread12,0);

CloseHandle(hThread12);

CTimect2=CTime:

intct11=ct1.GetSecond();

intct22=ct2.GetSecond();

intct33=ct22-ct11;

CStringStr=_T("

总的运行时间:

CStringStr1;

intt;

Str1.Format(TEXT("

%d"

),ct33);

Str+=Str1;

c_End.AddStri

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2