專利名稱:計(jì)算機(jī)操作系統(tǒng)事件同步對(duì)象擴(kuò)展的數(shù)據(jù)處理方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種計(jì)算機(jī)操作系統(tǒng)事件同步對(duì)象擴(kuò)展地?cái)?shù)據(jù)處理方法,尤其是一種基于構(gòu)件化技術(shù)的計(jì)算機(jī)操作系統(tǒng)內(nèi)核事件同步對(duì)象擴(kuò)展的數(shù)據(jù)處理方法。
背景技術(shù):
傳統(tǒng)上,系統(tǒng)提供的基本事件同步對(duì)象只包含兩個(gè)具體的狀態(tài)一個(gè)已通知狀態(tài)和一個(gè)未通知狀態(tài)。因此,通過(guò)對(duì)某個(gè)事件同步對(duì)象進(jìn)行等待操作而后被喚醒的線程只能知道該事件已經(jīng)發(fā)生了。同樣,通過(guò)對(duì)某個(gè)事件同步對(duì)象進(jìn)行設(shè)置操作的線程也只能是簡(jiǎn)單地以此通知一個(gè)或所有等待此事件同步對(duì)象的線程事件已經(jīng)發(fā)生了,除此之外不能再多傳遞給后者任何附加信息。而在實(shí)際應(yīng)用中,往往需要使用事件同步對(duì)象在等待事件的線程和設(shè)置事件的線程之間傳遞一些附加的通知信息。此時(shí)就需要借助額外的數(shù)據(jù)結(jié)構(gòu)并且很可能必須要組合使用其他的同步原語(yǔ)才能做得到。這種做法即便能達(dá)到所要求的語(yǔ)義要求,也無(wú)法避免下列問題
1、系統(tǒng)運(yùn)行效率會(huì)降低許多,并且在內(nèi)存使用上也造成了額外的負(fù)擔(dān);
2、傳統(tǒng)的基本事件同步對(duì)象的應(yīng)用往往會(huì)變得異常復(fù)雜,特別是在需要支持通用目標(biāo)的時(shí)候。所謂通用目標(biāo)是指在典型的應(yīng)用場(chǎng)景中,事件同步對(duì)象通常需要同時(shí)滿足下列要求
(1)可被應(yīng)用于多線程、搶占式的系統(tǒng)中;
(2)某一時(shí)刻會(huì)有多個(gè)需要傳遞不同的附加通知信息的線程和多個(gè)需要等待獲取附加通知信息的線程并發(fā)地訪問同一個(gè)事件同步對(duì)象;
(3)被喚醒的線程得到的應(yīng)該是設(shè)置此事件同步對(duì)象并喚醒它的那個(gè)線程在那一刻所設(shè)置的附加通知信息;
(4)允許最大的并發(fā)度,不應(yīng)該有不合理的阻塞或同步;
如何利用傳統(tǒng)的基本事件同步對(duì)象并很好完成上述的通用目標(biāo),迄今為止仍是一個(gè)工程上的難題。相應(yīng)的足夠好的解決方案目前仍然沒有被找到。
利用互斥鎖和條件變量進(jìn)行組合,以定制一個(gè)能傳遞附加通知信息的復(fù)合事件同步對(duì)象的解法從理論上來(lái)講也是可行的。但是實(shí)際應(yīng)用中依然無(wú)法避免下列問題
1、復(fù)合事件同步對(duì)象遠(yuǎn)不如基本事件同步對(duì)象運(yùn)行效率高,也不如后者占用的內(nèi)存少;
2、從實(shí)現(xiàn)上來(lái)講,僅僅通過(guò)使用一個(gè)互斥鎖、一個(gè)條件變量和一個(gè)狀態(tài)變量組合出來(lái)的復(fù)合事件同步對(duì)象是無(wú)法有效地支持上文中提及的通用目標(biāo)的。自行實(shí)現(xiàn)一個(gè)能完全符合上述通用目標(biāo)的復(fù)合事件同步對(duì)象是非常困難的。同樣,相應(yīng)的足夠好的解決方案迄今為止沒有被找到。
發(fā)明內(nèi)容
本發(fā)明的目的在于針對(duì)現(xiàn)有技術(shù)的不足,提出一種計(jì)算機(jī)操作系統(tǒng)事件同步對(duì)象擴(kuò)展的數(shù)據(jù)處理方法,可以顯著提高事件同步對(duì)象本身的通訊能力,使其可以滿足更廣泛的應(yīng)用需求。
為實(shí)現(xiàn)上述目的,本發(fā)明提供了一種計(jì)算機(jī)操作系統(tǒng)事件同步對(duì)象擴(kuò)展的數(shù)據(jù)處理方法,其中,包括設(shè)置事件操作方法以及等待事件操作方法,所述設(shè)置事件操作方法執(zhí)行以下步驟
步驟11、判斷當(dāng)前事件同步對(duì)象是否為手工重置的事件同步對(duì)象,是,則將所述事件同步對(duì)象的當(dāng)前狀態(tài)值設(shè)置為調(diào)用傳入的已通知狀態(tài)值;否則,執(zhí)行步驟14;
步驟12、判斷是否有線程阻塞在所述事件同步對(duì)象上,是,則在所述線程的線程結(jié)構(gòu)體的m_dwEventState數(shù)據(jù)項(xiàng)中記錄下調(diào)用傳入的已通知狀態(tài)值;否則,執(zhí)行步驟16;
步驟13、從所述事件同步對(duì)象的等待隊(duì)列中取下所述線程并喚醒所述線程,執(zhí)行步驟12;
步驟14、如果有線程阻塞在所述事件同步對(duì)象上,則對(duì)于阻塞在所述事件同步對(duì)象上的第一個(gè)線程,在其線程結(jié)構(gòu)體中的m_dwEventState數(shù)據(jù)項(xiàng)中記錄下調(diào)用傳入的已通知狀態(tài)值;否則,將所述事件同步對(duì)象的當(dāng)前狀態(tài)值設(shè)置為調(diào)用傳入的已通知狀態(tài)值,執(zhí)行步驟16;
步驟15、從所述事件同步對(duì)象的等待隊(duì)列中取下所述線程并喚醒所述線程;
步驟16、結(jié)束設(shè)置事件的操作;
所述等待事件操作方法執(zhí)行以下步驟
步驟21、判斷當(dāng)前事件同步對(duì)象是不是手工重置的事件同步對(duì)象,不是,則將所述事件同步對(duì)象設(shè)置為未通知狀態(tài);否則,執(zhí)行步驟24;
步驟22、判斷在將所述事件同步對(duì)象設(shè)置為未通知狀態(tài)前,所述事件同步對(duì)象是否處于未通知狀態(tài),是,則在所述事件同步對(duì)象上阻塞;否則,執(zhí)行步驟26;
步驟23、從當(dāng)前線程所對(duì)應(yīng)的線程結(jié)構(gòu)體的m_dwEventState數(shù)據(jù)項(xiàng)中獲取所述線程被喚醒時(shí)事件同步對(duì)象的已通知狀態(tài)值,并將所述已通知狀態(tài)值寫入由用戶指定的輸出參數(shù)中,執(zhí)行步驟27;
步驟24、判斷所述事件同步對(duì)象上是否處于未通知狀態(tài),是,則在所述事件同步對(duì)象上阻塞;否則,執(zhí)行步驟26;
步驟25、從當(dāng)前線程所對(duì)應(yīng)的線程結(jié)構(gòu)體的m_dwEventState數(shù)據(jù)項(xiàng)中獲取被喚醒時(shí)所述事件同步對(duì)象的已通知狀態(tài)值,并將所述已通知狀態(tài)值寫入由用戶指定的輸出參數(shù)中,執(zhí)行步驟27;
步驟26、將所述事件同步對(duì)象的當(dāng)前狀態(tài)值寫入由用戶指定的輸出參數(shù)中;
步驟27、結(jié)束等待事件的操作。
本發(fā)明允許當(dāng)事件發(fā)生時(shí),線程能夠通過(guò)事件同步對(duì)象告知等待在其上的線程更詳細(xì)的情況,從而顯著提高事件同步對(duì)象本身的通訊能力,使其可以滿足更廣泛的應(yīng)用需求。總的來(lái)說(shuō),本發(fā)明具有下列兩個(gè)優(yōu)勢(shì)
首先,因?yàn)槭侵苯俞槍?duì)最基本的事件同步對(duì)象進(jìn)行擴(kuò)展,所以能在最大程度上保證運(yùn)行效率,優(yōu)化內(nèi)存的使用;
其次,擴(kuò)展的事件同步對(duì)象是最基本的內(nèi)核對(duì)象,所以在實(shí)現(xiàn)上可以在超出傳統(tǒng)理論所描述的范圍之外的地方對(duì)其擴(kuò)展的語(yǔ)義進(jìn)行支持,從而很好的達(dá)到了上文所提到的通用目標(biāo)。
以下結(jié)合附圖和實(shí)施例對(duì)本發(fā)明做進(jìn)一步的詳細(xì)說(shuō)明。
圖1為本發(fā)明計(jì)算機(jī)操作系統(tǒng)事件同步對(duì)象擴(kuò)展的數(shù)據(jù)處理方法的實(shí)施例一中設(shè)置事件操作的流程圖2為本發(fā)明計(jì)算機(jī)操作系統(tǒng)事件同步對(duì)象擴(kuò)展的數(shù)據(jù)處理方法的實(shí)施例一中等待事件操作的流程圖3為本發(fā)明計(jì)算機(jī)操作系統(tǒng)事件同步對(duì)象擴(kuò)展的數(shù)據(jù)處理方法的實(shí)施例二中事件同步對(duì)象結(jié)構(gòu)體及線程對(duì)象結(jié)構(gòu)體中相關(guān)數(shù)據(jù)項(xiàng)的示意圖。
具體實(shí)施例方式
如圖1和圖2所示為本發(fā)明的實(shí)施例一,一種操作系統(tǒng)事件同步對(duì)象擴(kuò)展的數(shù)據(jù)處理方法,其中,設(shè)置事件操作執(zhí)行以下步驟
步驟101、如果當(dāng)前事件同步對(duì)象是手工重置的事件同步對(duì)象,則將所述事件同步對(duì)象的當(dāng)前狀態(tài)值設(shè)置為調(diào)用傳入的已通知狀態(tài)值;否則,執(zhí)行步驟104;
步驟102、如果有線程阻塞在所述事件同步對(duì)象上,則在所述線程的線程結(jié)構(gòu)體的m_dwEventState數(shù)據(jù)項(xiàng)中記錄下調(diào)用傳入的已通知狀態(tài)值;否則,執(zhí)行步驟106;
步驟103、從所述事件同步對(duì)象的等待隊(duì)列中取下所述線程并喚醒所述線程,執(zhí)行步驟102;
步驟104、如果有線程阻塞在所述事件同步對(duì)象上,則對(duì)于阻塞在所述事件同步對(duì)象上的第一個(gè)線程,在其線程結(jié)構(gòu)體中的m_dwEventState數(shù)據(jù)項(xiàng)中記錄下調(diào)用傳入的已通知狀態(tài)值;否則,將所述事件同步對(duì)象的當(dāng)前狀態(tài)值設(shè)置為調(diào)用傳入的已通知狀態(tài)值,執(zhí)行步驟106;
步驟105、從所述事件同步對(duì)象的等待隊(duì)列中取下所述線程并喚醒所述線程;
步驟106、結(jié)束。
一種操作系統(tǒng)事件同步對(duì)象擴(kuò)展的數(shù)據(jù)處理方法,其中,等待事件操作執(zhí)行以下步驟
步驟201、如果當(dāng)前事件同步對(duì)象不是手工重置的事件同步對(duì)象,則將所述事件同步對(duì)象設(shè)置為未通知狀態(tài);否則,執(zhí)行步驟204;
步驟202、如果在將所述事件同步對(duì)象設(shè)置為未通知狀態(tài)前,所述事件同步對(duì)象處于未通知狀態(tài),則在所述事件同步對(duì)象上阻塞;否則,執(zhí)行步驟206;
步驟203、從當(dāng)前線程所對(duì)應(yīng)的線程結(jié)構(gòu)體的m_dwEventState數(shù)據(jù)項(xiàng)中獲取所述線程被喚醒時(shí)事件同步對(duì)象的已通知狀態(tài)值,并將所述已通知狀態(tài)值寫入由用戶指定的輸出參數(shù)中,執(zhí)行步驟207;
步驟204、如果所述事件同步對(duì)象上處于未通知狀態(tài),則在所述事件同步對(duì)象上阻塞;如果該事件同步對(duì)象上沒有處于未通知狀態(tài),執(zhí)行步驟206;
步驟205、從當(dāng)前線程所對(duì)應(yīng)的線程結(jié)構(gòu)體的m_dwEventState數(shù)據(jù)項(xiàng)中獲取被喚醒時(shí)所述事件同步對(duì)象的已通知狀態(tài)值,并將所述已通知狀態(tài)值寫入由用戶指定的輸出參數(shù)中,執(zhí)行步驟207;
步驟206、將所述事件同步對(duì)象的當(dāng)前狀態(tài)值寫入由用戶指定的輸出參數(shù)中;
步驟207、結(jié)束。
以下為本發(fā)明的實(shí)施例二,參見圖3,為本發(fā)明所述事件同步對(duì)象結(jié)構(gòu)體及線程對(duì)象結(jié)構(gòu)體中相關(guān)數(shù)據(jù)項(xiàng)示意圖。
在等待事件同步對(duì)象變?yōu)橐淹ㄖ獱顟B(tài)的接口方法的實(shí)現(xiàn)中,被喚醒的線程從此線程結(jié)構(gòu)體的m_dwEventState數(shù)據(jù)項(xiàng)中獲取被喚醒時(shí)的事件同步對(duì)象的已通知狀態(tài),并將其返回給調(diào)用者。實(shí)現(xiàn)偽代碼表示如下
HRESULT Event::Wait(/*[out]*/DWORD*pdwState);{DWORD dwState;//根據(jù)該事件同步對(duì)象的類型作相應(yīng)處理if(m_bManualReset){if(UNSIGNALED==(dwState=m_dwState)){//在該事件同步對(duì)象上睡眠SleepOnEvent();if(NULL !=pdwState){//從線程結(jié)構(gòu)體中獲取線程被喚醒時(shí)的事件同步對(duì)象的//已通知狀態(tài)*pdwState=GetCurrentThread()->GetEventState();}}else{if(NULL !=pdwState){<!-- SIPO <DP n="6"> --><dp n="d6"/>*pdwSt ate=dwState;}}}else{if(UNSIGNALED==(dwState=InterlockedExchange((long*)&m_dwState,UNSIGNALED))){//在該事件同步對(duì)象上睡眠SleepOnEvent();if(NULL !=pdwState){//從線程結(jié)構(gòu)體中獲取線程被喚醒時(shí)的事件同步對(duì)象的//已通知狀態(tài)*pdwState=GetCurrentThread()->GetEventState();}}else{if(NULL !=pdwState){*pdwState=dwState;}}}}
相應(yīng)地,在將事件同步對(duì)象設(shè)置為已通知狀態(tài)的接口方法中,在所有被喚醒的線程的線程結(jié)構(gòu)體的m_dwEventState數(shù)據(jù)項(xiàng)中記下此時(shí)所傳入的事件同步對(duì)象的已通知狀態(tài)。實(shí)現(xiàn)偽代碼表示如下
HRESULT Event::Notify(/*[in]*/DwORD dwState);{Thread *pThread;//根據(jù)該事件同步對(duì)象的類型作相應(yīng)處理if(m_bManualReset){m_dwState=dwState;<!-- SIPO <DP n="7"> --><dp n="d7"/>//對(duì)事件同步對(duì)象的等待隊(duì)列中的所有線程進(jìn)行處理ForEachNodeOfWaitList(pThread){//在線程結(jié)構(gòu)體中設(shè)置線程被喚醒時(shí)的事件同步對(duì)象的//已通知狀態(tài)pThread->SetEventState(dwState);//從事件同步對(duì)象的的等待隊(duì)列中取下該線程并喚醒它DetachFromWaitListAndWakeUp(pThread);}}else{if(!IsWaitListEmpty()){//如果事件同步對(duì)象的等待隊(duì)列不為空,則取出第一個(gè)//等待線程來(lái)pThread=GetFirstNodeOfWaitList();//在線程結(jié)構(gòu)體中設(shè)置線程被喚醒時(shí)的事件同步對(duì)象的//已通知狀態(tài)pThread->SetEventState(dwState);//從事件同步對(duì)象的的等待隊(duì)列中取下該線程并喚醒它DetachFromWaitListAndWakeUp(pThread);}else{m_dwState=dwState;}}}
一個(gè)傳統(tǒng)的事件同步對(duì)象典型被應(yīng)用于線程等待某一事件發(fā)生的同步情況。而本發(fā)明應(yīng)用于線程等待某一有限事件集中的任意事件或非空事件子集發(fā)生的同步情況。假設(shè)這樣一種應(yīng)用情況在某系統(tǒng)中,有一個(gè)線程負(fù)責(zé)讀取或?qū)懭胛募?,完成后通過(guò)事件同步對(duì)象通知另外一個(gè)線程進(jìn)行某些后續(xù)操作。為此,我們使用事件同步對(duì)象來(lái)進(jìn)行兩者之間的同步。
首先,將所有的通知事件編碼定義如下
#define EVENT_READ 0x01 //讀文件
#define EVENT_WRITE 0x02 //寫文件
#define EVENT_ERROR 0x04 //讀/寫出錯(cuò)
然后,系統(tǒng)創(chuàng)建出一個(gè)事件同步對(duì)象,其實(shí)現(xiàn)偽代碼表示如下
//定義一個(gè)全局變量用于存放事件同步對(duì)象的接口指針,//使得這兩個(gè)線程都能夠訪問到它。IEvent *g_pEvent=NULL;HRESULT lnitialize(){//創(chuàng)建一個(gè)事件同步對(duì)象,對(duì)線程進(jìn)行同步HRESULT hr=EzCreateEVent(FALSE, //自動(dòng)重置的事件同步對(duì)象UNSIGNALED, //將事件初始狀態(tài)設(shè)為未通知狀態(tài)&g_pEVent);if (FAILED(hr)) return hr;...}
接下來(lái),負(fù)責(zé)讀取或?qū)懭胛募木€程需要在讀寫完成之后將事件同步對(duì)象設(shè)置為已通知狀態(tài)以通知另一個(gè)線程進(jìn)行后續(xù)操作,此時(shí)在其設(shè)置的已通知狀態(tài)中就包含了通知事件的具體信息。其實(shí)現(xiàn)偽代碼表示如下:
void Foo(){DWORD dwEvents=0;if(RequestReadFile()){dwEvents=EVENT_READ;//將文件讀入內(nèi)存。如果出錯(cuò),則設(shè)置EVENT_ERROR。if (!ReadFileIntoMemory()) {dwEvents |=EVENT_ERROR;<!-- SIPO <DP n="9"> --><dp n="d9"/>}}else{dwEvents=EVENT_WRITE;
最后,另一個(gè)進(jìn)行后續(xù)操作的線程在一開始首先去等待此事件的發(fā)生。在該線程被喚醒的同時(shí),也取出了通知事件的具體信息。而后就可以根據(jù)此信息進(jìn)行相應(yīng)后續(xù)操作。其實(shí)現(xiàn)偽代碼表示如下
void Bar(){DWORD dwEvents;...//等待第一個(gè)線程完成文件讀寫操作,并取得通知事件的具體信息g_pEvent->W(wǎng)ait(&dwEvents);if(dwEvents & EVENT_READ){if(dwEvents & EVENT_ERROR){//報(bào)告讀文件出錯(cuò),并進(jìn)行相應(yīng)后續(xù)處理...}else {//訪問內(nèi)存中的文件內(nèi)容...}}
由此可見,使用經(jīng)過(guò)本發(fā)明所述的方法擴(kuò)展的事件同步對(duì)象可以非常方便、有效地支持此類線程間的同步的應(yīng)用。
提供的事件同步對(duì)象的擴(kuò)展特性集中體現(xiàn)在事件同步對(duì)象的接口定義上,其各個(gè)方法如下表所示(同時(shí)列出WIN32的事件同步對(duì)象做為比較)
通過(guò)對(duì)比我們可以看到,本發(fā)明中,用于等待事件同步對(duì)象變?yōu)橐淹ㄖ獱顟B(tài)的接口方法上定義了一個(gè)[out]DWORD *pState參數(shù)。通過(guò)此參數(shù),等待事件同步對(duì)象變?yōu)橐淹ㄖ獱顟B(tài)的線程被通知喚醒的同時(shí),還可以獲取此刻的具體已通知狀態(tài)。相應(yīng)的,用于將事件同步對(duì)象設(shè)置為已通知狀態(tài)的接口方法上定義了一個(gè)[in]DWORD dwState參數(shù),通過(guò)此參數(shù),將事件同步對(duì)象設(shè)置為已通知狀態(tài)的線程可以設(shè)置事件同步對(duì)象的已通知狀態(tài)為一個(gè)具體的數(shù)值。本發(fā)明對(duì)這個(gè)參數(shù)數(shù)值的唯一限制是其不可以為零值。因?yàn)橄到y(tǒng)預(yù)定義了零值來(lái)表示事件同步對(duì)象的未通知狀態(tài)。
最后所應(yīng)說(shuō)明的是,以上實(shí)施例僅用以說(shuō)明本發(fā)明的技術(shù)方案而非限制,盡管參照較佳實(shí)施例對(duì)本發(fā)明進(jìn)行了詳細(xì)說(shuō)明,本領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解,可以對(duì)本發(fā)明的技術(shù)方案進(jìn)行修改或者等同替換,而不脫離本發(fā)明技術(shù)方案的精神和范圍,其均應(yīng)涵蓋在本發(fā)明的權(quán)利要求范圍當(dāng)中。
權(quán)利要求
1、一種計(jì)算機(jī)操作系統(tǒng)事件同步對(duì)象擴(kuò)展的數(shù)據(jù)處理方法,包括設(shè)置事件操作方法以及等待事件操作方法,其中,所述設(shè)置事件操作方法執(zhí)行以下步驟
步驟11、判斷當(dāng)前事件同步對(duì)象是否為手工重置的事件同步對(duì)象,是,則將所述事件同步對(duì)象的當(dāng)前狀態(tài)值設(shè)置為調(diào)用傳入的已通知狀態(tài)值;否則,執(zhí)行步驟14;
步驟12、判斷是否有線程阻塞在所述事件同步對(duì)象上,是,則在所述線程的線程結(jié)構(gòu)體的m_dwEventState數(shù)據(jù)項(xiàng)中記錄調(diào)用傳入的已通知狀態(tài)值;否則,執(zhí)行步驟16;
步驟13、從所述事件同步對(duì)象的等待隊(duì)列中取下所述線程并喚醒所述線程,執(zhí)行步驟12;
步驟14、如果有線程阻塞在所述事件同步對(duì)象上,則對(duì)于阻塞在所述事件同步對(duì)象上的第一個(gè)線程,在其線程結(jié)構(gòu)體中的m_dwEventState數(shù)據(jù)項(xiàng)中記錄下調(diào)用傳入的已通知狀態(tài)值;否則,將所述事件同步對(duì)象的當(dāng)前狀態(tài)值設(shè)置為調(diào)用傳入的已通知狀態(tài)值,執(zhí)行步驟16;
步驟15、從所述事件同步對(duì)象的等待隊(duì)列中取下所述線程并喚醒所述線程;
步驟16、結(jié)束設(shè)置事件的操作;
所述等待事件的操作方法執(zhí)行以下步驟
步驟21、判斷當(dāng)前事件同步對(duì)象是不是手工重置的事件同步對(duì)象,不是,則將所述事件同步對(duì)象設(shè)置為未通知狀態(tài);否則,執(zhí)行步驟24;
步驟22、判斷在將所述事件同步對(duì)象設(shè)置為未通知狀態(tài)前,所述事件同步對(duì)象是否處于未通知狀態(tài),是,則在所述事件同步對(duì)象上阻塞;否則,執(zhí)行步驟26;
步驟23、從當(dāng)前線程所對(duì)應(yīng)的線程結(jié)構(gòu)體的m_dwEventState數(shù)據(jù)項(xiàng)中獲取所述線程被喚醒時(shí)事件同步對(duì)象的已通知狀態(tài)值,并將所述已通知狀態(tài)值寫入由用戶指定的輸出參數(shù)中,執(zhí)行步驟27;
步驟24、判斷所述事件同步對(duì)象上是否處于未通知狀態(tài),是,則在所述事件同步對(duì)象上阻塞;否則,執(zhí)行步驟26;
步驟25、從當(dāng)前線程所對(duì)應(yīng)的線程結(jié)構(gòu)體的m_dwEventState數(shù)據(jù)項(xiàng)中獲取被喚醒時(shí)所述事件同步對(duì)象的已通知狀態(tài)值,并將所述已通知狀態(tài)值寫入由用戶指定的輸出參數(shù)中,執(zhí)行步驟27;
步驟26、將所述事件同步對(duì)象的當(dāng)前狀態(tài)值寫入由用戶指定的輸出參數(shù)中;
步驟27、結(jié)束等待事件的操作。
2、根據(jù)權(quán)利要求1所述的計(jì)算機(jī)操作系統(tǒng)事件同步對(duì)象擴(kuò)展的數(shù)據(jù)處理方法,其中,在所述設(shè)置事件的操作中,步驟11在所述事件同步對(duì)象的結(jié)構(gòu)體中定義一個(gè)無(wú)符號(hào)整型的數(shù)據(jù)成員變量m_dwState,用于指明此事件同步對(duì)象當(dāng)前所處的狀態(tài),該狀態(tài)包括已通知狀態(tài)及未通知狀態(tài)。
3、根據(jù)權(quán)利要求2所述的計(jì)算機(jī)操作系統(tǒng)事件同步對(duì)象擴(kuò)展的數(shù)據(jù)處理方法,其中,將所述m_dwState的值定義為1到232-1中任意一個(gè)數(shù)值,所述事件同步對(duì)象處于已通知狀態(tài),所述已通知狀態(tài)值為m_dwState的值;將所述所述m_dwState的值定義為零,所述事件同步對(duì)象處于未通知狀態(tài)。
4、根據(jù)權(quán)利要求1所述的計(jì)算機(jī)操作系統(tǒng)事件同步對(duì)象擴(kuò)展的數(shù)據(jù)處理方法,其中在所述設(shè)置事件的操作中,步驟12在所述m_dwEventState數(shù)據(jù)項(xiàng)中記錄所述已通知狀態(tài)值的具體過(guò)程為
首先,為所有阻塞在所述事件同步對(duì)象上的線程指定一個(gè)私有的存儲(chǔ)區(qū)域,用于記錄所述線程被喚醒時(shí)所述事件同步對(duì)象的已通知狀態(tài)值;
然后,在所述線程的線程結(jié)構(gòu)體中定義一個(gè)數(shù)據(jù)項(xiàng)m_dwEventState,用于表示所述存儲(chǔ)區(qū)域。
5、根據(jù)權(quán)利要求1所述的計(jì)算機(jī)操作系統(tǒng)事件同步對(duì)象擴(kuò)展的數(shù)據(jù)處理方法,其中,在所述等待事件的操作中,步驟23在所述事件同步對(duì)象的結(jié)構(gòu)體中定義了一個(gè)無(wú)符號(hào)整型的數(shù)據(jù)成員變量m_dwState,用于指明此事件同步對(duì)象當(dāng)前所處的狀態(tài),包括已通知狀態(tài)及未通知狀態(tài)。
6、根據(jù)權(quán)利要求5所述的計(jì)算機(jī)操作系統(tǒng)事件同步對(duì)象擴(kuò)展的數(shù)據(jù)處理方法,其中,將所述m_dwState的值定義為1到232-1中任意一個(gè)數(shù)值,所述事件同步對(duì)象處于已通知狀態(tài),所述已通知狀態(tài)值為m_dwState的值;將所述m_dwState的值定義為零,所述事件同步對(duì)象處于未通知狀態(tài)。
7、根據(jù)權(quán)利要求1所述的計(jì)算機(jī)操作系統(tǒng)事件同步對(duì)象擴(kuò)展的數(shù)據(jù)處理方法,其中,在所述等待事件的操作中,步驟23在所述m_dwEventState數(shù)據(jù)項(xiàng)中獲取所述已通知狀態(tài)值的具體過(guò)程為
首先,為所有阻塞在所述事件同步對(duì)象上的線程指定一個(gè)私有的存儲(chǔ)區(qū)域,用于獲取所述線程被喚醒時(shí)所述事件同步對(duì)象的已通知狀態(tài)值;
然后,在所述線程的線程結(jié)構(gòu)體中定義一個(gè)數(shù)據(jù)項(xiàng)m_dwEventState,用于表示所述存儲(chǔ)區(qū)域。
全文摘要
本發(fā)明涉及一種計(jì)算機(jī)操作系統(tǒng)事件同步對(duì)象擴(kuò)展的數(shù)據(jù)處理方法,擴(kuò)展了事件同步對(duì)象的傳統(tǒng)語(yǔ)義,使其擁有多個(gè)不同的已通知狀態(tài),同時(shí)也擴(kuò)展了事件同步對(duì)象的基本操作方法的接口定義。本發(fā)明允許當(dāng)事件發(fā)生時(shí),線程能夠通過(guò)事件同步對(duì)象告知等待在其上的線程更詳細(xì)的情況,從而顯著提高事件同步對(duì)象本身的通訊能力,使其可以滿足更廣泛的應(yīng)用需求。
文檔編號(hào)G06F9/52GK1838079SQ20061002465
公開日2006年9月27日 申請(qǐng)日期2006年3月14日 優(yōu)先權(quán)日2006年3月14日
發(fā)明者蘇翼鵬, 王晨輝 申請(qǐng)人:上??铺┦兰o(jì)科技有限公司