⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 15.4.1 火车站售票系统模拟程序.txt

📁 网上第一本以TXT格式的VC++深入详解孙鑫的书.全文全以TXT格式,并每一章节都分了目录,清晰易读
💻 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 + -