摘 要:在只有一塊CPU的電腦上,CPU可以輪流執(zhí)行多個(gè)程序,我們將一個(gè)進(jìn)程中運(yùn)行的多個(gè)程序稱為線程。在多線程的操作系統(tǒng)中,每個(gè)線程都是作為利用CPU的基本單位,是花費(fèi)最小開銷的實(shí)體。本文講述了線程的屬性、控制等問題。
關(guān)鍵詞:線程 信號(hào)量 掛起與解掛
中圖分類號(hào):TN919.8 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1674-098X(2013)04(c)-0051-01
1 線程的屬性與狀態(tài)
線程具有4個(gè)屬性:(1)輕型級(jí):線程中的實(shí)體基本上不擁有系統(tǒng)資源,只是有一點(diǎn)必不可少的、能保證獨(dú)立運(yùn)行的資源。(2)獨(dú)立調(diào)度和分派的基本單位:線程是能獨(dú)立運(yùn)行的基本單位,因而也是獨(dú)立調(diào)度和分派的基本單位。(3)可并發(fā)執(zhí)行:在一個(gè)進(jìn)程中的多個(gè)線程之間,可以并發(fā)執(zhí)行,甚至允許在一個(gè)進(jìn)程中所有線程都能并發(fā)執(zhí)行;同樣,不同進(jìn)程中的線程也能并發(fā)執(zhí)行。(4)共享進(jìn)程資源:在同一進(jìn)程中的各個(gè)線程,都可以共享該進(jìn)程所擁有的資源,比如,所有線程都具有相同的地址空間,線程可以訪問該地址空間的每一個(gè)虛地址,還可以訪問進(jìn)程所擁有的已打開文件、定時(shí)器、信號(hào)量等。
new為新生線程,它還沒有運(yùn)行。一旦調(diào)用start方法,線程進(jìn)入runnable可運(yùn)行狀態(tài)。在可運(yùn)行狀態(tài)中的線程不一定始終運(yùn)行,這依賴操作系統(tǒng)的服務(wù)。當(dāng)一個(gè)線程試圖獲取一個(gè)內(nèi)部的對(duì)象鎖,而該鎖被其他線程持有,線程進(jìn)入blocked阻塞狀態(tài)。當(dāng)線程等待另一個(gè)線程通知調(diào)度器一個(gè)條件時(shí),進(jìn)入waiting等待狀態(tài)。當(dāng)使用超時(shí)參數(shù)時(shí),會(huì)導(dǎo)致線程進(jìn)入timed waiting計(jì)時(shí)等待狀態(tài)。在阻塞狀態(tài)和等待狀態(tài)的線程所需的條件滿足時(shí),它們會(huì)回到runnable可運(yùn)行狀態(tài)。當(dāng)run方法正常退出或因?yàn)橐粋€(gè)沒有捕獲的異常終止了run方法及調(diào)用stop方法殺死線程時(shí),線程進(jìn)入terminated終止?fàn)顟B(tài)。
2 VC下的線程控制
在VC下每一個(gè)應(yīng)用程序都有一個(gè)默認(rèn)線程,這個(gè)線程就是應(yīng)用程序類。線程經(jīng)歷了創(chuàng)建、運(yùn)行、掛起、喚醒、結(jié)束的過程。在一個(gè)線程的整個(gè)生存周期中,三個(gè)重要成員函數(shù)的執(zhí)行順序是:InitInstance()->Run()->ExitInstance()。其中Run()是線程的核心,通常,Run當(dāng)中要包含一個(gè)無限循環(huán),使得線程能夠一刻不停地在后臺(tái)工作。線程創(chuàng)建過程是:從CWinThread類派生你的線程;將構(gòu)造函數(shù)的Protected屬性改為Public屬性;在ClassWizzard中增加Run函數(shù);在 Run函數(shù)中寫一個(gè)無限循環(huán),線程要執(zhí)行的工作在無限循環(huán)中進(jìn)行;將線程的頭文件包含到創(chuàng)建線程的CPP文件中;線程實(shí)例化;指定線程的附屬窗口;用線程的CreateThread()成員函數(shù)啟動(dòng)線程。
3 線程掛起和喚醒
在視圖的OnInitUpdate函數(shù)中可以為線程創(chuàng)建掛起信號(hào)燈和喚醒信號(hào)燈,這兩個(gè)信號(hào)燈的創(chuàng)建也需要在線程創(chuàng)建之前完成。增加線程掛起按鈕和喚醒按鈕,并增加響應(yīng)函數(shù);在線程Run函數(shù)的死循環(huán)中,檢查信號(hào)燈的代碼后面,增加掛起信號(hào)燈的檢查代碼:檢查掛起信號(hào)燈是否被主線程點(diǎn)亮,如果沒有被點(diǎn)亮,則線程正常工作;如果被點(diǎn)亮,則線程進(jìn)入掛起狀態(tài):即以無限等待喚醒方式點(diǎn)亮信號(hào)燈。還要增加掛起按鈕響應(yīng)函數(shù),并做如下事情:點(diǎn)亮掛起信號(hào)燈,關(guān)閉喚醒信號(hào)燈。繼續(xù)增加喚醒按鈕及響應(yīng)函數(shù),并做如下事情:點(diǎn)亮喚醒信號(hào)燈,關(guān)閉掛起信號(hào)燈。
4 結(jié)束線程
主線程向后臺(tái)線程發(fā)出無限循環(huán)結(jié)束請(qǐng)求,并無限等待應(yīng)答;后臺(tái)線程結(jié)束無限循環(huán)后,向主線程報(bào)告無限循環(huán)已經(jīng)結(jié)束;主線程連續(xù)向后臺(tái)線程發(fā)送請(qǐng)求釋放資源消息,并無限等待應(yīng)答;后臺(tái)線程收到釋放資源消息后,向主線程發(fā)出允許釋放資源應(yīng)答;這樣在視圖的OnInitUpdate函數(shù)中創(chuàng)建所需要的3個(gè)信號(hào)燈,這3個(gè)信號(hào)燈的創(chuàng)建需要在線程創(chuàng)建之前完成,并增加結(jié)束線程的按鈕和響應(yīng)函數(shù)。
5 線程控制流程示例
以上講述的內(nèi)容可以用圖2來表示。
6 結(jié)語
近年來推出的各種通用操作系統(tǒng)都引入了線程,以便進(jìn)一步提高系統(tǒng)的并發(fā)性,并把它視為現(xiàn)代操作系統(tǒng)的一個(gè)重要指標(biāo)。線程的使用非常普遍,在各種語言環(huán)境中靈活的應(yīng)用是非常重要的。本文試圖論述它一般的使用方法,從而豐富我們課堂的教學(xué)內(nèi)容。
參考文獻(xiàn)
[1] 韋樸.VC通用范例開發(fā)金典[M].北京:電子工業(yè)出版社,2008.
[2] 林建素.Eclipse開發(fā)[M].北京:電子工業(yè)出版社,2008.