?? 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 + -