蘭洪霞
摘 要:本文介紹了ELIS海洋石油成像測井地面采集系統(tǒng)多線程應(yīng)用的設(shè)計(jì)及實(shí)現(xiàn),分析多線程技術(shù)的優(yōu)缺點(diǎn),并對使用多線程技術(shù)后的ELIS地面采集系統(tǒng)和使用前做了性能分析對比,證明多線程技術(shù)應(yīng)用對ELIS地面采集系統(tǒng)性能的提升。
關(guān)鍵詞:測井系統(tǒng) 數(shù)據(jù)采集 多線程 同步
中圖分類號:TE3 文獻(xiàn)標(biāo)識碼:A 文章編號:1672-3791(2014)02(a)-0027-03
ELIS海洋石油成像測井系統(tǒng)(Enhanced Logging Imaging System)是中海油田股份有限公司自主研發(fā)具有自主知識產(chǎn)權(quán)的用于海上石油勘探開發(fā)的電纜測井成像系統(tǒng),它主要由地面采集系統(tǒng)、井下儀器和數(shù)據(jù)解釋處理三個(gè)部分組成。
ELIS地面采集系統(tǒng)基于前后臺方式(客戶端/服務(wù)器),通過網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)交換。前端機(jī)系統(tǒng)做為服務(wù)器,完成實(shí)時(shí)數(shù)據(jù)采集和預(yù)處理,后臺主機(jī)實(shí)現(xiàn)數(shù)據(jù)的處理和顯示,用戶接口,為操作工程師提供各種井下儀器的實(shí)時(shí)控制界面,完成服務(wù)表的編輯和加載,數(shù)據(jù)的處理和顯示、存儲(chǔ)、出圖。由于后臺主機(jī)要同事處理多個(gè)任務(wù),且有很高的實(shí)時(shí)性要求,所以采用多線程設(shè)計(jì)開發(fā)模式,取得了良好的效果。
1 設(shè)計(jì)思想
ELIS地面采集系統(tǒng)最初采用的是單線程設(shè)計(jì),其中網(wǎng)絡(luò)接收、數(shù)據(jù)處理、數(shù)據(jù)顯示、界面響應(yīng)、命令發(fā)送等功能都在同一個(gè)線程內(nèi)順序執(zhí)行,即執(zhí)行玩、完一個(gè)功能,才能執(zhí)行下一個(gè)功能,其示意如圖1所示。
在掛接常規(guī)井下測井儀器時(shí)這種設(shè)計(jì)模式?jīng)]有問題,但是在掛接采樣率高、數(shù)據(jù)量大、計(jì)算復(fù)雜的高端測井儀器時(shí)由于網(wǎng)絡(luò)接收、數(shù)據(jù)處理占用了大量CPU時(shí)間,出現(xiàn)了界面響應(yīng)慢、儀器命令無法下發(fā)、顯示刷新慢等問題,經(jīng)過重新設(shè)計(jì),把ELIS地面采集系統(tǒng)由單線程設(shè)計(jì)改進(jìn)為多線程設(shè)計(jì),其設(shè)計(jì)圖如圖2所示。
把原有的單線程設(shè)計(jì)改為多線程設(shè)計(jì),即把網(wǎng)絡(luò)接收、數(shù)據(jù)處理、數(shù)據(jù)顯示、界面響應(yīng)、命令發(fā)送、文件存儲(chǔ)劃分為獨(dú)立的線程,并行執(zhí)行。
線程本質(zhì)上是一個(gè)獨(dú)立運(yùn)行的代碼段,是CPU調(diào)度和分配的基本單元,多線程設(shè)計(jì)將應(yīng)用程序劃分為多個(gè)獨(dú)立的任務(wù),其優(yōu)點(diǎn):
(1)當(dāng)前沒有進(jìn)行處理的任務(wù)時(shí)可以將處理器時(shí)間讓給其它任務(wù)。
(2)占用大量處理時(shí)間的任務(wù)可以定期將處理器時(shí)間讓給其它任務(wù)。
(3)多線程技術(shù)使程序的響應(yīng)速度更快,因?yàn)橛脩艚缑婵梢栽谶M(jìn)行其它工作的同時(shí)一直處于活動(dòng)狀態(tài)。
(4)可以隨時(shí)停止任務(wù)。
(5)可以分別設(shè)置各個(gè)任務(wù)的優(yōu)先級以優(yōu)化性能。
在ELIS地面采集系統(tǒng)軟件中充分利用了多線程的優(yōu)勢:
(1)網(wǎng)絡(luò)接收作為獨(dú)立的線程,采用阻塞的Socket模型,即網(wǎng)絡(luò)上來數(shù)據(jù)了接收,沒有數(shù)據(jù)的時(shí)候等待,等待時(shí)把處理器時(shí)間讓給其它任務(wù),提高了效率。
(2)數(shù)據(jù)處理線程占用大量處理時(shí)間,在其中使用PeekMessage函數(shù)響應(yīng)界面及其它線程的消息。
(3)單線程設(shè)計(jì)因?yàn)槠渌蝿?wù)繁忙,界面響應(yīng)緩慢,無法及時(shí)下發(fā)儀器控制命令,多線程技術(shù)使程序的響應(yīng)速度更快,成功得解決了這個(gè)問題。
(4)提高網(wǎng)絡(luò)接收線程的優(yōu)先級,確保實(shí)時(shí)采集的數(shù)據(jù)包不丟失。
Message函數(shù)發(fā)送線程間消息,讓網(wǎng)絡(luò)接收、數(shù)據(jù)處理等線程停下來,完成內(nèi)存分配及初始化后再發(fā)送線程間消息重啟線程,達(dá)到線程間的調(diào)度和協(xié)調(diào)。
但是多線程也存在一些缺點(diǎn),主要包括:
(1)線程的使用會(huì)給系統(tǒng)帶來上下文切換的額外負(fù)擔(dān),負(fù)擔(dān)超過一定程度時(shí),多線程的效率就會(huì)降低。
(2)當(dāng)多個(gè)線程需要對公有變量進(jìn)行寫操作時(shí),后一個(gè)線程往往會(huì)修改掉前一個(gè)線程存放的數(shù)據(jù),即線程同步問題。
(3)即較長時(shí)間的等待或資源競爭以及死鎖等多線程癥狀。
(4)程序復(fù)雜度增加,調(diào)試?yán)щy。
為了克服上述缺點(diǎn),對ELIS地面采集系統(tǒng)軟件進(jìn)行了精心設(shè)計(jì):
(1)線程不能過多,過多會(huì)給系統(tǒng)帶來上下文切換的額外負(fù)擔(dān),降低系統(tǒng)效率,而且會(huì)調(diào)度協(xié)調(diào)困難,需要合理劃分功能模塊,界定模塊邊界,我們把系統(tǒng)設(shè)計(jì)為網(wǎng)絡(luò)接收、數(shù)據(jù)處理、數(shù)據(jù)顯示、界面響應(yīng)、命令發(fā)送、文件存儲(chǔ)六個(gè)線程,經(jīng)實(shí)踐證明這樣劃分科學(xué)高效。
(2)線程同步問題。
①使用臨界區(qū)(CCriticalSection)和互斥量(CMutex)保護(hù)共享資源,當(dāng)多個(gè)線程訪問一個(gè)共享資源時(shí),可以使用臨界區(qū)或互斥量對該共享資源進(jìn)行保護(hù),保證同一時(shí)刻只有一個(gè)線程可以訪問該共享資源,其他希望訪問共享資源的線程將被掛起等待,直到擁有共享資源的線程放棄共享資源為止,這樣就保證了不會(huì)在同一時(shí)刻出現(xiàn)多個(gè)線程訪問共享資源。
②事件(CEvent),事件是一個(gè)允許一個(gè)線程在某種情況發(fā)生時(shí),喚醒另外一個(gè)線程的同步對象。例如數(shù)據(jù)處理線程處理完一包數(shù)據(jù)就會(huì)發(fā)送一個(gè)特定的事件通知數(shù)據(jù)顯示和數(shù)據(jù)存儲(chǔ)線程更新。
③互斥量(CMutex),互斥對象與臨界區(qū)對象很像.互斥對象與臨界區(qū)對象的不同在于:互斥對象可以在進(jìn)程間使用,而臨界區(qū)對象只能在同一進(jìn)程的各線程間使用。當(dāng)然,互斥對象也可以用于同一進(jìn)程的各個(gè)線程間,但是在這種情況下,使用臨界區(qū)會(huì)更節(jié)省系統(tǒng)資源,更有效率。
(3)由于多線程各線程之間是并行的任務(wù)搶占式工作方式,各線程的執(zhí)行次序不可預(yù)期,導(dǎo)致有些錯(cuò)誤只有在特定情況才會(huì)出現(xiàn),不易重現(xiàn),難以調(diào)試定位,我們采用在程序內(nèi)部添加TRACE調(diào)試語句及外部線程觀測器兩種方式定位問題。
2 程序?qū)崿F(xiàn)
程序用VC++6.0實(shí)現(xiàn),VC++6.0的MFC類庫提供了兩種類型的線程:輔助線程(Worker
摘 要:本文介紹了ELIS海洋石油成像測井地面采集系統(tǒng)多線程應(yīng)用的設(shè)計(jì)及實(shí)現(xiàn),分析多線程技術(shù)的優(yōu)缺點(diǎn),并對使用多線程技術(shù)后的ELIS地面采集系統(tǒng)和使用前做了性能分析對比,證明多線程技術(shù)應(yīng)用對ELIS地面采集系統(tǒng)性能的提升。
關(guān)鍵詞:測井系統(tǒng) 數(shù)據(jù)采集 多線程 同步
中圖分類號:TE3 文獻(xiàn)標(biāo)識碼:A 文章編號:1672-3791(2014)02(a)-0027-03
ELIS海洋石油成像測井系統(tǒng)(Enhanced Logging Imaging System)是中海油田股份有限公司自主研發(fā)具有自主知識產(chǎn)權(quán)的用于海上石油勘探開發(fā)的電纜測井成像系統(tǒng),它主要由地面采集系統(tǒng)、井下儀器和數(shù)據(jù)解釋處理三個(gè)部分組成。
ELIS地面采集系統(tǒng)基于前后臺方式(客戶端/服務(wù)器),通過網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)交換。前端機(jī)系統(tǒng)做為服務(wù)器,完成實(shí)時(shí)數(shù)據(jù)采集和預(yù)處理,后臺主機(jī)實(shí)現(xiàn)數(shù)據(jù)的處理和顯示,用戶接口,為操作工程師提供各種井下儀器的實(shí)時(shí)控制界面,完成服務(wù)表的編輯和加載,數(shù)據(jù)的處理和顯示、存儲(chǔ)、出圖。由于后臺主機(jī)要同事處理多個(gè)任務(wù),且有很高的實(shí)時(shí)性要求,所以采用多線程設(shè)計(jì)開發(fā)模式,取得了良好的效果。
1 設(shè)計(jì)思想
ELIS地面采集系統(tǒng)最初采用的是單線程設(shè)計(jì),其中網(wǎng)絡(luò)接收、數(shù)據(jù)處理、數(shù)據(jù)顯示、界面響應(yīng)、命令發(fā)送等功能都在同一個(gè)線程內(nèi)順序執(zhí)行,即執(zhí)行玩、完一個(gè)功能,才能執(zhí)行下一個(gè)功能,其示意如圖1所示。
在掛接常規(guī)井下測井儀器時(shí)這種設(shè)計(jì)模式?jīng)]有問題,但是在掛接采樣率高、數(shù)據(jù)量大、計(jì)算復(fù)雜的高端測井儀器時(shí)由于網(wǎng)絡(luò)接收、數(shù)據(jù)處理占用了大量CPU時(shí)間,出現(xiàn)了界面響應(yīng)慢、儀器命令無法下發(fā)、顯示刷新慢等問題,經(jīng)過重新設(shè)計(jì),把ELIS地面采集系統(tǒng)由單線程設(shè)計(jì)改進(jìn)為多線程設(shè)計(jì),其設(shè)計(jì)圖如圖2所示。
把原有的單線程設(shè)計(jì)改為多線程設(shè)計(jì),即把網(wǎng)絡(luò)接收、數(shù)據(jù)處理、數(shù)據(jù)顯示、界面響應(yīng)、命令發(fā)送、文件存儲(chǔ)劃分為獨(dú)立的線程,并行執(zhí)行。
線程本質(zhì)上是一個(gè)獨(dú)立運(yùn)行的代碼段,是CPU調(diào)度和分配的基本單元,多線程設(shè)計(jì)將應(yīng)用程序劃分為多個(gè)獨(dú)立的任務(wù),其優(yōu)點(diǎn):
(1)當(dāng)前沒有進(jìn)行處理的任務(wù)時(shí)可以將處理器時(shí)間讓給其它任務(wù)。
(2)占用大量處理時(shí)間的任務(wù)可以定期將處理器時(shí)間讓給其它任務(wù)。
(3)多線程技術(shù)使程序的響應(yīng)速度更快,因?yàn)橛脩艚缑婵梢栽谶M(jìn)行其它工作的同時(shí)一直處于活動(dòng)狀態(tài)。
(4)可以隨時(shí)停止任務(wù)。
(5)可以分別設(shè)置各個(gè)任務(wù)的優(yōu)先級以優(yōu)化性能。
在ELIS地面采集系統(tǒng)軟件中充分利用了多線程的優(yōu)勢:
(1)網(wǎng)絡(luò)接收作為獨(dú)立的線程,采用阻塞的Socket模型,即網(wǎng)絡(luò)上來數(shù)據(jù)了接收,沒有數(shù)據(jù)的時(shí)候等待,等待時(shí)把處理器時(shí)間讓給其它任務(wù),提高了效率。
(2)數(shù)據(jù)處理線程占用大量處理時(shí)間,在其中使用PeekMessage函數(shù)響應(yīng)界面及其它線程的消息。
(3)單線程設(shè)計(jì)因?yàn)槠渌蝿?wù)繁忙,界面響應(yīng)緩慢,無法及時(shí)下發(fā)儀器控制命令,多線程技術(shù)使程序的響應(yīng)速度更快,成功得解決了這個(gè)問題。
(4)提高網(wǎng)絡(luò)接收線程的優(yōu)先級,確保實(shí)時(shí)采集的數(shù)據(jù)包不丟失。
Message函數(shù)發(fā)送線程間消息,讓網(wǎng)絡(luò)接收、數(shù)據(jù)處理等線程停下來,完成內(nèi)存分配及初始化后再發(fā)送線程間消息重啟線程,達(dá)到線程間的調(diào)度和協(xié)調(diào)。
但是多線程也存在一些缺點(diǎn),主要包括:
(1)線程的使用會(huì)給系統(tǒng)帶來上下文切換的額外負(fù)擔(dān),負(fù)擔(dān)超過一定程度時(shí),多線程的效率就會(huì)降低。
(2)當(dāng)多個(gè)線程需要對公有變量進(jìn)行寫操作時(shí),后一個(gè)線程往往會(huì)修改掉前一個(gè)線程存放的數(shù)據(jù),即線程同步問題。
(3)即較長時(shí)間的等待或資源競爭以及死鎖等多線程癥狀。
(4)程序復(fù)雜度增加,調(diào)試?yán)щy。
為了克服上述缺點(diǎn),對ELIS地面采集系統(tǒng)軟件進(jìn)行了精心設(shè)計(jì):
(1)線程不能過多,過多會(huì)給系統(tǒng)帶來上下文切換的額外負(fù)擔(dān),降低系統(tǒng)效率,而且會(huì)調(diào)度協(xié)調(diào)困難,需要合理劃分功能模塊,界定模塊邊界,我們把系統(tǒng)設(shè)計(jì)為網(wǎng)絡(luò)接收、數(shù)據(jù)處理、數(shù)據(jù)顯示、界面響應(yīng)、命令發(fā)送、文件存儲(chǔ)六個(gè)線程,經(jīng)實(shí)踐證明這樣劃分科學(xué)高效。
(2)線程同步問題。
①使用臨界區(qū)(CCriticalSection)和互斥量(CMutex)保護(hù)共享資源,當(dāng)多個(gè)線程訪問一個(gè)共享資源時(shí),可以使用臨界區(qū)或互斥量對該共享資源進(jìn)行保護(hù),保證同一時(shí)刻只有一個(gè)線程可以訪問該共享資源,其他希望訪問共享資源的線程將被掛起等待,直到擁有共享資源的線程放棄共享資源為止,這樣就保證了不會(huì)在同一時(shí)刻出現(xiàn)多個(gè)線程訪問共享資源。
②事件(CEvent),事件是一個(gè)允許一個(gè)線程在某種情況發(fā)生時(shí),喚醒另外一個(gè)線程的同步對象。例如數(shù)據(jù)處理線程處理完一包數(shù)據(jù)就會(huì)發(fā)送一個(gè)特定的事件通知數(shù)據(jù)顯示和數(shù)據(jù)存儲(chǔ)線程更新。
③互斥量(CMutex),互斥對象與臨界區(qū)對象很像.互斥對象與臨界區(qū)對象的不同在于:互斥對象可以在進(jìn)程間使用,而臨界區(qū)對象只能在同一進(jìn)程的各線程間使用。當(dāng)然,互斥對象也可以用于同一進(jìn)程的各個(gè)線程間,但是在這種情況下,使用臨界區(qū)會(huì)更節(jié)省系統(tǒng)資源,更有效率。
(3)由于多線程各線程之間是并行的任務(wù)搶占式工作方式,各線程的執(zhí)行次序不可預(yù)期,導(dǎo)致有些錯(cuò)誤只有在特定情況才會(huì)出現(xiàn),不易重現(xiàn),難以調(diào)試定位,我們采用在程序內(nèi)部添加TRACE調(diào)試語句及外部線程觀測器兩種方式定位問題。
2 程序?qū)崿F(xiàn)
程序用VC++6.0實(shí)現(xiàn),VC++6.0的MFC類庫提供了兩種類型的線程:輔助線程(Worker
摘 要:本文介紹了ELIS海洋石油成像測井地面采集系統(tǒng)多線程應(yīng)用的設(shè)計(jì)及實(shí)現(xiàn),分析多線程技術(shù)的優(yōu)缺點(diǎn),并對使用多線程技術(shù)后的ELIS地面采集系統(tǒng)和使用前做了性能分析對比,證明多線程技術(shù)應(yīng)用對ELIS地面采集系統(tǒng)性能的提升。
關(guān)鍵詞:測井系統(tǒng) 數(shù)據(jù)采集 多線程 同步
中圖分類號:TE3 文獻(xiàn)標(biāo)識碼:A 文章編號:1672-3791(2014)02(a)-0027-03
ELIS海洋石油成像測井系統(tǒng)(Enhanced Logging Imaging System)是中海油田股份有限公司自主研發(fā)具有自主知識產(chǎn)權(quán)的用于海上石油勘探開發(fā)的電纜測井成像系統(tǒng),它主要由地面采集系統(tǒng)、井下儀器和數(shù)據(jù)解釋處理三個(gè)部分組成。
ELIS地面采集系統(tǒng)基于前后臺方式(客戶端/服務(wù)器),通過網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)交換。前端機(jī)系統(tǒng)做為服務(wù)器,完成實(shí)時(shí)數(shù)據(jù)采集和預(yù)處理,后臺主機(jī)實(shí)現(xiàn)數(shù)據(jù)的處理和顯示,用戶接口,為操作工程師提供各種井下儀器的實(shí)時(shí)控制界面,完成服務(wù)表的編輯和加載,數(shù)據(jù)的處理和顯示、存儲(chǔ)、出圖。由于后臺主機(jī)要同事處理多個(gè)任務(wù),且有很高的實(shí)時(shí)性要求,所以采用多線程設(shè)計(jì)開發(fā)模式,取得了良好的效果。
1 設(shè)計(jì)思想
ELIS地面采集系統(tǒng)最初采用的是單線程設(shè)計(jì),其中網(wǎng)絡(luò)接收、數(shù)據(jù)處理、數(shù)據(jù)顯示、界面響應(yīng)、命令發(fā)送等功能都在同一個(gè)線程內(nèi)順序執(zhí)行,即執(zhí)行玩、完一個(gè)功能,才能執(zhí)行下一個(gè)功能,其示意如圖1所示。
在掛接常規(guī)井下測井儀器時(shí)這種設(shè)計(jì)模式?jīng)]有問題,但是在掛接采樣率高、數(shù)據(jù)量大、計(jì)算復(fù)雜的高端測井儀器時(shí)由于網(wǎng)絡(luò)接收、數(shù)據(jù)處理占用了大量CPU時(shí)間,出現(xiàn)了界面響應(yīng)慢、儀器命令無法下發(fā)、顯示刷新慢等問題,經(jīng)過重新設(shè)計(jì),把ELIS地面采集系統(tǒng)由單線程設(shè)計(jì)改進(jìn)為多線程設(shè)計(jì),其設(shè)計(jì)圖如圖2所示。
把原有的單線程設(shè)計(jì)改為多線程設(shè)計(jì),即把網(wǎng)絡(luò)接收、數(shù)據(jù)處理、數(shù)據(jù)顯示、界面響應(yīng)、命令發(fā)送、文件存儲(chǔ)劃分為獨(dú)立的線程,并行執(zhí)行。
線程本質(zhì)上是一個(gè)獨(dú)立運(yùn)行的代碼段,是CPU調(diào)度和分配的基本單元,多線程設(shè)計(jì)將應(yīng)用程序劃分為多個(gè)獨(dú)立的任務(wù),其優(yōu)點(diǎn):
(1)當(dāng)前沒有進(jìn)行處理的任務(wù)時(shí)可以將處理器時(shí)間讓給其它任務(wù)。
(2)占用大量處理時(shí)間的任務(wù)可以定期將處理器時(shí)間讓給其它任務(wù)。
(3)多線程技術(shù)使程序的響應(yīng)速度更快,因?yàn)橛脩艚缑婵梢栽谶M(jìn)行其它工作的同時(shí)一直處于活動(dòng)狀態(tài)。
(4)可以隨時(shí)停止任務(wù)。
(5)可以分別設(shè)置各個(gè)任務(wù)的優(yōu)先級以優(yōu)化性能。
在ELIS地面采集系統(tǒng)軟件中充分利用了多線程的優(yōu)勢:
(1)網(wǎng)絡(luò)接收作為獨(dú)立的線程,采用阻塞的Socket模型,即網(wǎng)絡(luò)上來數(shù)據(jù)了接收,沒有數(shù)據(jù)的時(shí)候等待,等待時(shí)把處理器時(shí)間讓給其它任務(wù),提高了效率。
(2)數(shù)據(jù)處理線程占用大量處理時(shí)間,在其中使用PeekMessage函數(shù)響應(yīng)界面及其它線程的消息。
(3)單線程設(shè)計(jì)因?yàn)槠渌蝿?wù)繁忙,界面響應(yīng)緩慢,無法及時(shí)下發(fā)儀器控制命令,多線程技術(shù)使程序的響應(yīng)速度更快,成功得解決了這個(gè)問題。
(4)提高網(wǎng)絡(luò)接收線程的優(yōu)先級,確保實(shí)時(shí)采集的數(shù)據(jù)包不丟失。
Message函數(shù)發(fā)送線程間消息,讓網(wǎng)絡(luò)接收、數(shù)據(jù)處理等線程停下來,完成內(nèi)存分配及初始化后再發(fā)送線程間消息重啟線程,達(dá)到線程間的調(diào)度和協(xié)調(diào)。
但是多線程也存在一些缺點(diǎn),主要包括:
(1)線程的使用會(huì)給系統(tǒng)帶來上下文切換的額外負(fù)擔(dān),負(fù)擔(dān)超過一定程度時(shí),多線程的效率就會(huì)降低。
(2)當(dāng)多個(gè)線程需要對公有變量進(jìn)行寫操作時(shí),后一個(gè)線程往往會(huì)修改掉前一個(gè)線程存放的數(shù)據(jù),即線程同步問題。
(3)即較長時(shí)間的等待或資源競爭以及死鎖等多線程癥狀。
(4)程序復(fù)雜度增加,調(diào)試?yán)щy。
為了克服上述缺點(diǎn),對ELIS地面采集系統(tǒng)軟件進(jìn)行了精心設(shè)計(jì):
(1)線程不能過多,過多會(huì)給系統(tǒng)帶來上下文切換的額外負(fù)擔(dān),降低系統(tǒng)效率,而且會(huì)調(diào)度協(xié)調(diào)困難,需要合理劃分功能模塊,界定模塊邊界,我們把系統(tǒng)設(shè)計(jì)為網(wǎng)絡(luò)接收、數(shù)據(jù)處理、數(shù)據(jù)顯示、界面響應(yīng)、命令發(fā)送、文件存儲(chǔ)六個(gè)線程,經(jīng)實(shí)踐證明這樣劃分科學(xué)高效。
(2)線程同步問題。
①使用臨界區(qū)(CCriticalSection)和互斥量(CMutex)保護(hù)共享資源,當(dāng)多個(gè)線程訪問一個(gè)共享資源時(shí),可以使用臨界區(qū)或互斥量對該共享資源進(jìn)行保護(hù),保證同一時(shí)刻只有一個(gè)線程可以訪問該共享資源,其他希望訪問共享資源的線程將被掛起等待,直到擁有共享資源的線程放棄共享資源為止,這樣就保證了不會(huì)在同一時(shí)刻出現(xiàn)多個(gè)線程訪問共享資源。
②事件(CEvent),事件是一個(gè)允許一個(gè)線程在某種情況發(fā)生時(shí),喚醒另外一個(gè)線程的同步對象。例如數(shù)據(jù)處理線程處理完一包數(shù)據(jù)就會(huì)發(fā)送一個(gè)特定的事件通知數(shù)據(jù)顯示和數(shù)據(jù)存儲(chǔ)線程更新。
③互斥量(CMutex),互斥對象與臨界區(qū)對象很像.互斥對象與臨界區(qū)對象的不同在于:互斥對象可以在進(jìn)程間使用,而臨界區(qū)對象只能在同一進(jìn)程的各線程間使用。當(dāng)然,互斥對象也可以用于同一進(jìn)程的各個(gè)線程間,但是在這種情況下,使用臨界區(qū)會(huì)更節(jié)省系統(tǒng)資源,更有效率。
(3)由于多線程各線程之間是并行的任務(wù)搶占式工作方式,各線程的執(zhí)行次序不可預(yù)期,導(dǎo)致有些錯(cuò)誤只有在特定情況才會(huì)出現(xiàn),不易重現(xiàn),難以調(diào)試定位,我們采用在程序內(nèi)部添加TRACE調(diào)試語句及外部線程觀測器兩種方式定位問題。
2 程序?qū)崿F(xiàn)
程序用VC++6.0實(shí)現(xiàn),VC++6.0的MFC類庫提供了兩種類型的線程:輔助線程(Worker