多線程編程方法是一種高級的編程技術(shù),同時它也是復(fù)雜應(yīng)用程序系統(tǒng)中,一種重要的和必不可少的程序設(shè)計技術(shù),它能有效地解決各種并行的復(fù)雜工作任務(wù),使一些特別復(fù)雜的應(yīng)用系統(tǒng)的總體設(shè)計和解決方案,變得更簡潔和更清晰起來。多線程編程方法的運用,一般需要位于計算機底層的操作系統(tǒng)的有效支持,同時也需要操作系統(tǒng)能夠提供,一些用于多線程支持的系統(tǒng)功能服務(wù)接口(如信號量通信原語的操作接口)。但是僅有這些仍然是不夠的,例如,這些服務(wù)接口太過于底層而不容易被學(xué)習(xí)使用,也不安全。因此在基礎(chǔ)庫系統(tǒng)中,同樣也需要對多線程編程方法提供更多和更有效的支持。這主要包含兩個方面的內(nèi)容,首先就是提供對多線程支持得更好和更完善的功能封裝,也即線程庫;另外一項當然也很重要,那就是基礎(chǔ)庫系統(tǒng)中各組件模塊的線程安全設(shè)計。
1、 線程庫
線程庫是基礎(chǔ)庫系統(tǒng)中一個重要的組成模塊。設(shè)計線程庫時,應(yīng)該首先考慮它的模型的建立,以及它應(yīng)該所涵蓋的功能。主要包括有用于線程間互斥和同步控制的功能實現(xiàn)與封裝,線程的創(chuàng)建、運行和銷毀,以及訪問并控制線程的一些運行狀態(tài)或錯誤狀態(tài)等。另外線程庫也涉及到,線程之間的數(shù)據(jù)共享或數(shù)據(jù)通信等功能的實現(xiàn)。下面我們主要介紹兩種有代表性的線程庫的實現(xiàn),也即MFC中的線程庫和JDK平臺中的線程模型。
MFC中為了實現(xiàn)線程間互斥和同步控制功能,主要提供有四種類型的對象,如圖10-57所示,包括CCriticalSection、CEvent、CMutex以及CSemaphore等。
首先介紹CMutex類型,它是對NT操作系統(tǒng)內(nèi)核中提供的互斥對象(mutex)的封裝。它能夠確保線程擁有對單個資源的互斥訪問權(quán),也即多線程對共享資源的互斥訪問。互斥對象包含一個使用數(shù)量,一個線程ID和一個遞歸計數(shù)器。并且線程在等待訪問資源時可以設(shè)定一個超時值。
CCriticalSection類型是對臨界區(qū)(critical section)的封裝。它的作用與特性和CMutex類似,都是用于線程間對共享資源的互斥訪問,但是它與CMutex之間稍有不同的是,它不屬于內(nèi)核對象,而是屬于用戶方式的對象。所以它的效率要比CMutex高很多,并且因為如此,它也只能被用于線程之間的互斥控制,而不能用于進程之間的互斥。
CEvent是對事件(event)內(nèi)核對象的封裝,它是一個最基本,也最靈活的,被用于線程間實現(xiàn)同步的控制對象。CEvent能夠通知一個操作已經(jīng)完成。它有兩種不同類型的事件對象。一種是人工重置的事件,另一種是自動重置的事件。當人工重置的事件得到通知時,等待該事件的所有線程均變?yōu)榭烧{(diào)度線程。當一個自動重置的事件得到通知時,等待該事件的線程中只有一個線程變?yōu)榭烧{(diào)度線程。
最后一個就是CSemaphore類型,它是對信號量(Semaphore)內(nèi)核對象的封裝。適用于線程之間的同步控制,它是功能、使用最靈活,也最復(fù)雜的同步控制對象。
除了上面講述到的幾種用于實現(xiàn)線程間互斥和同步的控制對象外,MFC的線程庫中還有一個非常重要的類模塊,也即CWinThread,它是表示應(yīng)用程序中的執(zhí)行線程,管理線程的創(chuàng)建、運行和銷毀,以及其它許多方面的功能(如線程優(yōu)先級、狀態(tài)等)。
1、 線程庫
線程庫是基礎(chǔ)庫系統(tǒng)中一個重要的組成模塊。設(shè)計線程庫時,應(yīng)該首先考慮它的模型的建立,以及它應(yīng)該所涵蓋的功能。主要包括有用于線程間互斥和同步控制的功能實現(xiàn)與封裝,線程的創(chuàng)建、運行和銷毀,以及訪問并控制線程的一些運行狀態(tài)或錯誤狀態(tài)等。另外線程庫也涉及到,線程之間的數(shù)據(jù)共享或數(shù)據(jù)通信等功能的實現(xiàn)。下面我們主要介紹兩種有代表性的線程庫的實現(xiàn),也即MFC中的線程庫和JDK平臺中的線程模型。
MFC中為了實現(xiàn)線程間互斥和同步控制功能,主要提供有四種類型的對象,如圖10-57所示,包括CCriticalSection、CEvent、CMutex以及CSemaphore等。
首先介紹CMutex類型,它是對NT操作系統(tǒng)內(nèi)核中提供的互斥對象(mutex)的封裝。它能夠確保線程擁有對單個資源的互斥訪問權(quán),也即多線程對共享資源的互斥訪問。互斥對象包含一個使用數(shù)量,一個線程ID和一個遞歸計數(shù)器。并且線程在等待訪問資源時可以設(shè)定一個超時值。
CCriticalSection類型是對臨界區(qū)(critical section)的封裝。它的作用與特性和CMutex類似,都是用于線程間對共享資源的互斥訪問,但是它與CMutex之間稍有不同的是,它不屬于內(nèi)核對象,而是屬于用戶方式的對象。所以它的效率要比CMutex高很多,并且因為如此,它也只能被用于線程之間的互斥控制,而不能用于進程之間的互斥。
CEvent是對事件(event)內(nèi)核對象的封裝,它是一個最基本,也最靈活的,被用于線程間實現(xiàn)同步的控制對象。CEvent能夠通知一個操作已經(jīng)完成。它有兩種不同類型的事件對象。一種是人工重置的事件,另一種是自動重置的事件。當人工重置的事件得到通知時,等待該事件的所有線程均變?yōu)榭烧{(diào)度線程。當一個自動重置的事件得到通知時,等待該事件的線程中只有一個線程變?yōu)榭烧{(diào)度線程。
最后一個就是CSemaphore類型,它是對信號量(Semaphore)內(nèi)核對象的封裝。適用于線程之間的同步控制,它是功能、使用最靈活,也最復(fù)雜的同步控制對象。
除了上面講述到的幾種用于實現(xiàn)線程間互斥和同步的控制對象外,MFC的線程庫中還有一個非常重要的類模塊,也即CWinThread,它是表示應(yīng)用程序中的執(zhí)行線程,管理線程的創(chuàng)建、運行和銷毀,以及其它許多方面的功能(如線程優(yōu)先級、狀態(tài)等)。