资源描述
操作系统:用多线程模拟汽车司机与售票员需求分析试验报告
本实验利用多线程模拟汽车司机与售票员之间的协同工作即同步过程。一方面只有售票员把车门关好了司机才能开车,因此,售票员关好车门应通知司机开车;另一方面,只有汽车已经停下,售票员才能开门上下客,故司机停车后应通知售票员。实验的结果是在屏幕显示二者的同步过程。
一、 设计过程
基本原理:在Windows的一个进程内包含一个或多个线程,32位Windows环境下的WIN32 API提供了多线程应用程序开发所需的接口函数,本实验就是C++语言编写的WIN32 API的多线程编程。
具体过程:
1. 创建两个信号对象,设定初始值;
2. 创建两个子线程函数,一个为司机的操作过程,一个为售票员的操作过程。我们在这里设定站点数为10个;在司机操作的子线程中,用一个while循环,当到最后一站时,就退出,此时,程序运行结束。
3. 编写主线程函数,在其中调用两个子线程。
二、 源代码
#include <iostream。h〉
#include <windows。h>
HANDLE hSemaphore1=CreateSemaphore(NULL, 0, 1, NULL);
HANDLE hSemaphore2=CreateSemaphore(NULL, 0, 1, NULL);
int station=1;
DWORD WINAPI ThreadDriver( LPVOID LpParameter )
{
while(station〈=10)
{
cout〈<”司机正常行车"<〈endl;
cout<<"前方为"<〈station〈<”站点”〈〈endl;
if(station==10)
{
cout〈〈"终点站到了”〈<endl;
return 0;
}
cout〈〈"到达"〈〈station〈〈"站点”〈<endl;
ReleaseSemaphore(hSemaphore2,1,NULL);
WaitForSingleObject(hSemaphore1,INFINITE);
cout<〈"离站开车”<〈station<<endl<<endl〈〈endl;
Sleep(500);
station++;
}
return 0;
}
DWORD WINAPI ThreadConductor( LPVOID LpParameter )
{
while(1)
{
WaitForSingleObject(hSemaphore2,INFINITE);
cout<<"售票员开门”<<endl;
Sleep(1000);
cout<〈”乘客正在上车”〈<endl;
Sleep(6000);
cout<〈”售票员关门”<<endl;
cout<<"售票员向刚上车售票”<〈endl;
ReleaseSemaphore(hSemaphore1,1,NULL);
Sleep(1000);
}
return 0;
}
int main()
{
HANDLE hDriver;
HANDLE hConductor;
cout<<"多线程模拟司机售票员同步过程\n";
cout〈<”——------———-——-———-—-———-——-\n”;
hDriver=CreateThread(NULL,0,ThreadDriver,NULL,0,NULL);
Sleep(10);
hConductor=CreateThread(NULL,0,ThreadConductor,NULL,0,NULL);
Sleep(300000);
CloseHandle(hDriver);
CloseHandle(hConductor);
return 0;
}
三、 运行结果:
多线程模拟司机售票员同步过程
—-----—-—-——-—-—--——--—-—-——
司机正常行车
前方为1站点
到达1站点
售票员开门
乘客正在上车
售票员关门
售票员向刚上车售票
离站开车
司机正常行车
前方为2站点
到达2站点
售票员开门
乘客正在上车
售票员关门
售票员向刚上车售票
离站开车
司机正常行车
前方为3站点
到达3站点
售票员开门
乘客正在上车
售票员关门
售票员向刚上车售票
离站开车
司机正常行车
前方为4站点
到达4站点
售票员开门
乘客正在上车
售票员关门
售票员向刚上车售票
离站开车
司机正常行车
前方为5站点
到达5站点
售票员开门
乘客正在上车
售票员关门
售票员向刚上车售票
离站开车
司机正常行车
前方为6站点
到达6站点
售票员开门
乘客正在上车
售票员关门
售票员向刚上车售票
离站开车
司机正常行车
前方为7站点
到达7站点
售票员开门
乘客正在上车
售票员关门
售票员向刚上车售票
离站开车
司机正常行车
前方为8站点
到达8站点
售票员开门
乘客正在上车
售票员关门
售票员向刚上车售票
离站开车
司机正常行车
前方为9站点
到达9站点
售票员开门
乘客正在上车
售票员关门
售票员向刚上车售票
离站开车
司机正常行车
前方为10站点
终点站到了
四、 程序结果分析
从运行结果看,基本上模拟了司机和售票员的同步过程。此程序简单的实现了线程间的同步过程,即运用win32提供的接口函数,主要是CreateThread,WaitForSingleObject,ReleaseSemaphore这几个函数实现主要功能.
程序还有很多欠缺,需要做进一步的改进。比如可以实际线路的同步过程,考虑司机与售票员同步过程中的更多现实因素,比如,提供站点时间、上下车人数等等,将其运用到实际当中去。
展开阅读全文