資源描述:
《實驗7 多線程編程.ppt》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、實驗7WinSock多線程編程7.1WinSock為什么需要多線程編程7.1.1WinSock的兩種輸入輸出模式如前所述,WinSock在進行輸入輸出的時候,可以使用兩種工作模式。即“阻塞”模式(BlockingMode)或“非阻塞”模式,又稱為同步模式或異步模式。工作在“阻塞”模式的套接字稱為阻塞套接字,工作在“非阻塞”模式下的套接字稱為非阻塞套接字。阻塞模式在I/O操作完成前不會立即交出CPU控制權(quán)返回,獨占的運行方式使整個進程處于阻塞的等待狀態(tài)。采用阻塞進程的單進程服務(wù)器不能很好的同時為多個客戶機服務(wù)。非阻塞模式時,進程調(diào)用并執(zhí)行I/
2、O時,無論操作是否完成,函數(shù)會立即返回。7.1.2兩種模式的優(yōu)缺點及解決方法“阻塞”與“非阻塞”模式各有其優(yōu)點和缺點。阻塞套接字的I/O操作工作情況比較確定,無非是調(diào)用、等待、返回。大部分情況下,I/O操作都能成功地完成,不過就是花費了等待的時間。因而比較容易使用,容易編程;但在應(yīng)付諸如需要建立多個套接字連接來為多個客戶服務(wù)的時候,或在數(shù)據(jù)的收發(fā)量不均勻的時候,或在輸入輸出的時間不確定的時候,卻顯得性能低下,甚至無能為力。使用非阻塞套接字,需要編寫更多的代碼,因為必須恰當(dāng)?shù)匕盐照{(diào)用I/O函數(shù)的時機,盡量減少無功而返的調(diào)用,還必須詳加分析每個
3、Winsock調(diào)用中收到的WSAEWOULDBLOCK錯誤,采取相應(yīng)的對策,這種I/O操作的隨機性使得非阻塞套接字顯得難于操作。所以,必須采取一些適當(dāng)?shù)膶Σ?,克服這兩種模式的缺點,讓阻塞和非阻塞套接字能夠滿足各種場合的要求。對于非阻塞的套接字工作模式,進一步引入了五種“套接字I/O模型”;對于阻塞的套接字工作模式,則進一步引入了多線程機制。7.2Win32操作系統(tǒng)下的多進程多線程機制7.2.1Win32OS是單用戶多任務(wù)的操作系統(tǒng)最早的DOS是單用戶單任務(wù)的。后來發(fā)展到圖形界面的Windows,發(fā)展到Windows95,Windows98,
4、就都支持多任務(wù)了,從WindowsNT起,Windows操作系統(tǒng)更是發(fā)展成了一個真正的搶占式多任務(wù)操作系統(tǒng)。7.2.2Win32OS是支持多線程的操作系統(tǒng)Win32操作系統(tǒng)還支持同一進程的多線程。在一個Windows進程內(nèi),可以包含多個線程。一個線程(thread)是進程內(nèi)的一條執(zhí)行路徑,具體地說,是一個應(yīng)用程序中的一條可執(zhí)行路徑,往往是應(yīng)用程序中的一個或多個函數(shù)。一個進程中至少要有一個線程,習(xí)慣將它稱為主線程。任何一個應(yīng)用程序進程都有一個主線程。一般C程序中的Main或WinMain函數(shù)就規(guī)定了主線程的執(zhí)行代碼。當(dāng)你啟動了一個應(yīng)用程序時,
5、操作系統(tǒng)在為它創(chuàng)建了進程之后,也創(chuàng)建了該進程的主線程,并根據(jù)Main或WinMain函數(shù)的地址,開始執(zhí)行該進程的主線程。主線程可以創(chuàng)建并啟動其他輔助線程,由主線程創(chuàng)建的線程又可以創(chuàng)建并啟動更多的線程。一個線程也需要占用一定的系統(tǒng)資源,線程是進程中相對獨立的執(zhí)行單位,也是Win32操作系統(tǒng)中可調(diào)度的最小的執(zhí)行單位。多個進程中的多個線程并發(fā)地執(zhí)行。對于擁有多個處理機的計算機系統(tǒng),調(diào)度程序可以將不同的線程安排到不同的處理機上去運行,一方面平衡了CPU的負載,另一方面也提高了系統(tǒng)的運行效率。當(dāng)某個線程的代碼都執(zhí)行完畢時,該線程會自動終止;當(dāng)一個線程
6、終止時,會將它所占用的資源釋放給進程。7.2.3多線程機制在網(wǎng)絡(luò)編程中的應(yīng)用如果一個應(yīng)用程序,有多個任務(wù)需要同時進行處理,那就最適合使用多線程機制。對于網(wǎng)絡(luò)上客戶機軟件,采用多線程的編程技術(shù),能克服在單線程的編程模式下,由于阻塞等待而產(chǎn)生的客戶程序就不能及時響應(yīng)用戶的操作命令的問題。對于網(wǎng)絡(luò)上服務(wù)器軟件,采用多線程的編程技術(shù),能更好地為多個客戶服務(wù)。即便是對于一個客戶,采用多線程機制也能大大提高應(yīng)用程序的運行效率。比如大家熟悉的東方快車、網(wǎng)絡(luò)螞蟻等文件下載軟件,就采用了多線程機制,用多個線程同時下載一個文件的不同部分,大大加快了下載速度。7
7、.3VisualC++6.0對多線程網(wǎng)絡(luò)編程的支持VisualC++6.0為程序員提供了Windows應(yīng)用程序的集成開發(fā)環(huán)境,在這個環(huán)境下,有兩種開發(fā)程序的方法。既可以直接使用Win32API來編寫C風(fēng)格的Win32應(yīng)用程序,也可以利用MFC基礎(chǔ)類庫編寫C++風(fēng)格的應(yīng)用程序。在這兩種Windows應(yīng)用程序的開發(fā)方式下,多線程的編程原理是一致的。7.3.1MFC支持的兩種線程微軟的基礎(chǔ)類庫MFC提供了對于多線程應(yīng)用程序的支持。在MFC中,線程分為兩種,一種是用戶接口線程(user-interfacethread),或稱用戶界面線程;另一種是工
8、作線程(theworkerthread),這兩類線程可以滿足不同任務(wù)的處理需求。1.用戶接口線程用戶接口線程通常用來處理用戶輸入產(chǎn)生的消息和事件,并獨立地響應(yīng)正在應(yīng)用程序其它部分