📄 15.4.1 火车站售票系统模拟程序.txt
字号:
15.4 线程同步
15.4.1 火车站售票系统模拟程序
下面,我们来编写一个模拟火车站售票系统的程序。我们知道,在实际生活中,多个人可以同时购
买火车票。也就说,火车站的售票系统肯定是采用多线程技术实现的。这里,我们在上面己编写的
MultiThread程序中再创建一个线程:线程2,然后由主线程创建的两个线程(线程 1和线程2)负责销
售火车票。为了创建线程2,可以参照MultiThread.cpp文件中线程1的创建代码。这时的程序代码如
例 15-2所示。
例 15-2
#include <windows .h>
#include <iostream.h>
DWORD WINAPI Fun1Proc(
LPVOID lpParameter / / thread data
DWORD WINAPI Fun2Proc(
LPVOID lpParameter // thread data
int index 0;
int tickets=100 ;
void main ()
{
HANDLE hThread1;
HANDLE hThread2;
/ /创建线程
hThreadl=CreateThread(NULL, 0, Fun1Proc , NULL , 0, NULL) ;
hThread2=CreateThread(NULL, 0 ,Fun2Proc , NULL , 0 ,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2) ;
/* while(index++<1000)
cout<<"rnain thread工 s running"<<end1;
Sleep(10) ;*/
Sleep(4000);
}
//线程 1的入口函数
1. DWORD WINAPI Fun1Proc(
2. LPVOID 1pPararneter 11 thread data
3. )
4. {
5. /* whi1e(index++<1000)
6. cout<<"thread1 is running"<<endl;*/
7. while (TRUE)
8. {
9. if(tickets>0)
10. cout<<"thread1 sell ticket : "<<tickets一--<<endl;
1 1. else
12. break;
13. }
14.
15. return 0;
16. }
11线程 2的入口函数 DWORD W工 NAPI Fun2Proc( LPVOID lpPararneter 11 thread data
while(TRUE)
if (tickets>0)
{
cout<<"thread2 sell ticket : "<<tickets--<<endl;
}
else
{
break;
}
return 0;
}
在上述例 15-2所示代码中,首先添加了线程 2入口函数 (Fun2Proc)的声明,然后在 mu函数中调用
CreateThread函数创建该线程。并且当该线程创建之后,调用 CloseHandle函数将此线程的句柄关
闭。
此外,如例 15-2所示代码又定义了一个全局的变量: tickets,用来表示销售的剩余票
数。本例为该变量赋予初值: 100.也就说新创建的两个线程将负责销售 100张票。对于第一个线程
函数 ( FunlProc)来说,先将其中己有的代码注释起来。为了让该线
程能够不断地销售火车票,需要进行一个 while循环。在此循环中,判断 tickets变量的值,如果
大于 0,就销售一张票,即输出" thread 1 sell ticket : ".接着将当前所卖出的票号打印出来,
然后 tickets变量的值减 1;如果 tickets等于或小于 O.则表明票已经卖完了,调用 break 语句终
止 while循环。
对于第二个线程函数 (Fun2Proc)来说,其实现过程与第一个线程函数是一样的,只是输出语句是:
"thread2 sell ticket :"。
对主线程来说,这时需要保证在创建的两个线程卖完这 100张票之前,该线程不能退出。否则,如
果主线程退出了,进程就结束了,线程 1和线程 2也就退出了。因此,在两个线程卖完 100张票之
前,不能让主线程退出。这时,有些读者可能就会想到可以这样做 :
为了让主线程持续运行,让它进行一个空的 while循环,例如在 main函数的最后添加如下代码:
while (TRUE) {}
要注意的是,采用这种方式,对于主线程来说,它是能够运行的,并且它将占用 CPU的时间,这样
就会影响 MultiThread程序执行的效率。因此,为了让主线程不退出,井且不影响程序运行的效率,
我们可以调用 Sleep函数,并让其睡眠一段时间,例如 4秒。这样,当程序执行到 Sleep函数时,
主线程就放弃其执行的权利,进入等待状态,这时的主线程是不占用 CPU时间的。
Build并运行 MultiThead程序,将出现如图 15.9所示的窗口。可以看到线程 1从第 100张票开始销
售,当该线程执行一段时间后,线程 2开始运行,该线程执行一段时间后,线程 l又继续执行。线
程 l和线程 2就是按这种方式交替执行,直到销售完 100张票,即最后打印出最后一张票号:1。可
以看到,线程 l和线程 2在卖票时,销售的火车票号都是连续的,说明火车票销售的过
程是正常的。
图 15.9火车票销售系统模拟程序运行结果
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -