欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種實(shí)時(shí)快速的線程間數(shù)據(jù)交換方法

文檔序號(hào):6355471閱讀:517來(lái)源:國(guó)知局
專(zhuān)利名稱(chēng):一種實(shí)時(shí)快速的線程間數(shù)據(jù)交換方法
技術(shù)領(lǐng)域
本發(fā)明涉及信息處理技術(shù)領(lǐng)域,尤其涉及線程間數(shù)據(jù)交換的方法,可以應(yīng)用于各 種軟件系統(tǒng)研發(fā)的軟件開(kāi)發(fā)技術(shù)領(lǐng)域。
背景技術(shù)
在信息技術(shù)領(lǐng)域中,軟件開(kāi)發(fā)涉及很多的技術(shù),包括內(nèi)存數(shù)據(jù)組織管理、消息通 信、索引技術(shù)、進(jìn)程間數(shù)據(jù)交換、線程間數(shù)據(jù)交換等。本發(fā)明關(guān)注于軟件開(kāi)發(fā)中線程間的數(shù) 據(jù)交換技術(shù)。在一些特定的軟件系統(tǒng)研發(fā)過(guò)程中涉及到線程間的數(shù)據(jù)交換,而且對(duì)數(shù)據(jù)交 換具有較高的實(shí)時(shí)性和高效性的要求,比如說(shuō)實(shí)時(shí)數(shù)據(jù)庫(kù)管理系統(tǒng)、關(guān)系數(shù)據(jù)庫(kù)管理系 統(tǒng)、中間件等。由于進(jìn)程間的內(nèi)存數(shù)據(jù)不能互相訪問(wèn),因此,進(jìn)程間數(shù)據(jù)交換比較復(fù)雜,通常的方 法包括共享內(nèi)存方式、動(dòng)態(tài)數(shù)據(jù)交換(DDE)、數(shù)據(jù)管道、socket套接字等。相對(duì)于進(jìn)程間 數(shù)據(jù)交換,線程間的數(shù)據(jù)交換就比較簡(jiǎn)單了,可以通過(guò)直接訪問(wèn)內(nèi)存數(shù)據(jù)的方式進(jìn)行數(shù)據(jù) 交換,其中需要特別關(guān)注內(nèi)存數(shù)據(jù)組織管理和內(nèi)存數(shù)據(jù)同步機(jī)制。如果對(duì)線程間數(shù)據(jù)交換 沒(méi)有性能要求,那么可以根據(jù)軟件系統(tǒng)需要,通過(guò)變量或者內(nèi)存塊交換數(shù)據(jù),再加上事件 (Event)、臨界區(qū)(Critical Section)、互斥量(Mutex)或者信號(hào)量(Semaphone)來(lái)實(shí)現(xiàn)同 步機(jī)制,即可實(shí)現(xiàn)線程間的數(shù)據(jù)交換。然而,對(duì)于一些性能要求很高的軟件系統(tǒng)來(lái)說(shuō),則需 要精心地設(shè)計(jì)內(nèi)存數(shù)據(jù)組織管理方式和內(nèi)存數(shù)據(jù)同步機(jī)制,實(shí)現(xiàn)實(shí)時(shí)快速的線程間數(shù)據(jù)交 換,滿足軟件系統(tǒng)在線程間數(shù)據(jù)交換的需求,從而提高軟件系統(tǒng)的整體性能。在研發(fā)軟件系統(tǒng)過(guò)程中通常會(huì)遇到線程間進(jìn)行數(shù)據(jù)交換的問(wèn)題,如果需要交換的 數(shù)據(jù)量少,用一些簡(jiǎn)單的變量、內(nèi)存以及互斥量就可以實(shí)現(xiàn),但是,一些性能要求較高的軟 件系統(tǒng)對(duì)線程間數(shù)據(jù)交換有實(shí)時(shí)性需求和吞吐量要求。在進(jìn)行零星數(shù)據(jù)交換時(shí),數(shù)據(jù)需要 在非常短的時(shí)間內(nèi)完成交換;在進(jìn)行海量數(shù)據(jù)交換時(shí),數(shù)據(jù)交換必須具有很高的吞吐量。在 這些軟件系統(tǒng)的研發(fā)過(guò)程中,通常需要開(kāi)發(fā)人員耗費(fèi)較長(zhǎng)的時(shí)間來(lái)設(shè)計(jì)和實(shí)現(xiàn)線程間的數(shù) 據(jù)交換,而且最終實(shí)現(xiàn)的效果并不一定能夠滿足軟件系統(tǒng)對(duì)線程間數(shù)據(jù)交換的實(shí)時(shí)性需求 和吞吐量要求。

發(fā)明內(nèi)容
本發(fā)明針對(duì)實(shí)時(shí)數(shù)據(jù)庫(kù)管理系統(tǒng)、關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)、中間件的線程間數(shù)據(jù)交 換的實(shí)時(shí)性需求和性能要求,設(shè)計(jì)并提出了一種實(shí)時(shí)快速的線程間數(shù)據(jù)交換方法。本發(fā)明針對(duì)這類(lèi)技術(shù)問(wèn)題,提出了一種通用的、實(shí)時(shí)快速的線程間數(shù)據(jù)交換的技 術(shù)解決方案,給出了線程間數(shù)據(jù)交換組件的具體實(shí)現(xiàn)細(xì)節(jié),一方面,可以大大節(jié)約開(kāi)發(fā)人員 的時(shí)間,另外一方面,可以滿足軟件系統(tǒng)對(duì)線程間數(shù)據(jù)交換的實(shí)時(shí)性需求和吞吐量要求?!N實(shí)時(shí)快速的線程間數(shù)據(jù)交換方法,包括以下步驟1)數(shù)據(jù)提供線程和數(shù)據(jù)消費(fèi)線程共享的內(nèi)存中設(shè)置一個(gè)緩存數(shù)據(jù)結(jié)構(gòu),所述緩存 數(shù)據(jù)結(jié)內(nèi)部包括多個(gè)數(shù)據(jù)緩存塊;
2)數(shù)據(jù)提供線程通過(guò)調(diào)用數(shù)據(jù)放入接口,將數(shù)據(jù)放入數(shù)據(jù)緩存塊中;3)數(shù)據(jù)消費(fèi)線程通過(guò)調(diào)用數(shù)據(jù)獲取接口讀取數(shù)據(jù)緩存塊中的數(shù)據(jù),實(shí)現(xiàn)快速的數(shù) 據(jù)交換。所述緩存數(shù)據(jù)結(jié)構(gòu)中,包括n+1個(gè)緩存塊,其中η個(gè)緩存塊用于循環(huán)放入數(shù)據(jù);第 η+1個(gè)緩存塊稱(chēng)作置換塊,用于獲取數(shù)據(jù)時(shí)與存有數(shù)據(jù)的緩存塊進(jìn)行置換。采用數(shù)據(jù)可放事件描述緩存數(shù)據(jù)結(jié)構(gòu)中是否有用于放入數(shù)據(jù)的未滿緩存塊;數(shù)據(jù) 可取事件描述緩存數(shù)據(jù)結(jié)構(gòu)中是否有存有數(shù)據(jù)的緩存塊用于獲取數(shù)據(jù);操作臨界區(qū)用于數(shù) 據(jù)提供線程和數(shù)據(jù)消費(fèi)線程對(duì)η個(gè)緩存塊進(jìn)行訪問(wèn)操作時(shí)實(shí)現(xiàn)同步。當(dāng)數(shù)據(jù)提供線程調(diào)用數(shù)據(jù)放入接口時(shí),首先進(jìn)入操作臨界區(qū),檢查當(dāng)前緩存塊是 否還有足夠的空間放入數(shù)據(jù),如果空間足夠,則將數(shù)據(jù)放入當(dāng)前緩存塊,離開(kāi)操作臨界區(qū), 數(shù)據(jù)放入成功;如果當(dāng)前緩存塊沒(méi)有足夠的空間放入數(shù)據(jù),觸發(fā)數(shù)據(jù)可取事件,判斷下一個(gè)緩存 塊是否為空,如果下一個(gè)緩存塊為空,則將當(dāng)前緩存塊移動(dòng)到下一個(gè)緩存塊,將數(shù)據(jù)放入當(dāng) 前緩存塊。如果下一個(gè)緩存塊不為空,等待數(shù)據(jù)可放事件,重新進(jìn)入操作臨界區(qū),并將數(shù)據(jù)放 入緩存塊中。等待數(shù)據(jù)可放事件的時(shí)間為可設(shè)置的參數(shù),如果等待超時(shí),則數(shù)據(jù)放入失敗。當(dāng)數(shù)據(jù)消費(fèi)線程調(diào)用數(shù)據(jù)獲取接口時(shí),首先等待數(shù)據(jù)可取事件,進(jìn)入操作臨界區(qū), 如果判斷不存在有數(shù)據(jù)的緩存塊,則重置數(shù)據(jù)可取事件,離開(kāi)操作臨界區(qū),數(shù)據(jù)獲取失敗。如果判斷存在有數(shù)據(jù)的緩存塊,則將置換塊中的數(shù)據(jù)清空,并與置換塊之外有數(shù) 據(jù)的緩存塊進(jìn)行置換。如果置換塊之外不存在有數(shù)據(jù)的緩存塊,則重置數(shù)據(jù)可取事件。最后觸發(fā)數(shù)據(jù)可放事件,離開(kāi)操作臨界區(qū),數(shù)據(jù)獲取成功。(三)有益效果根據(jù)以上技術(shù)解決方案可以看出,本發(fā)明具有以下有益效果1、本發(fā)明提出了以批量方式獲取數(shù)據(jù)的數(shù)據(jù)交換方法,當(dāng)某個(gè)緩存塊滿了,或者 等待數(shù)據(jù)可取事件超時(shí)之后,數(shù)據(jù)消費(fèi)線程才會(huì)讀取緩存塊中的數(shù)據(jù)。而且,本發(fā)明在獲取 緩存塊數(shù)據(jù)時(shí),采用緩存塊置換的方式,有效地減少了數(shù)據(jù)消費(fèi)線程搶占操作臨界區(qū)的時(shí) 間,從而減少了數(shù)據(jù)提供線程的等待時(shí)間,提高了并發(fā)度,能有大大提高數(shù)據(jù)交換的性能。2、本發(fā)明對(duì)零星數(shù)據(jù)交換的實(shí)時(shí)性也能夠得到保證,數(shù)據(jù)消費(fèi)線程在讀取數(shù)據(jù)之 前等待數(shù)據(jù)可取事件的超時(shí)時(shí)間為P毫秒,在最壞情況下,等待超時(shí),此時(shí)數(shù)據(jù)交換的延遲 為P毫秒。因此,在零星數(shù)據(jù)交換時(shí),數(shù)據(jù)交換的最大延遲小于等于P毫秒。3、本發(fā)明提供兩個(gè)簡(jiǎn)潔的數(shù)據(jù)放入和數(shù)據(jù)獲取接口,支持各種類(lèi)型的軟件系統(tǒng), 尤其能夠滿足具有實(shí)時(shí)性要求的高性能軟件系統(tǒng)的需求。


圖1為本發(fā)明數(shù)據(jù)交換組件結(jié)構(gòu)示意圖;圖2為本發(fā)明數(shù)據(jù)交換方法中數(shù)據(jù)放入操作流程圖;圖3為本發(fā)明數(shù)據(jù)交換方法中數(shù)據(jù)獲取操作流程圖;圖4為數(shù)據(jù)交換組件初始化方法流程圖。
具體實(shí)施例方式下面結(jié)合附圖和具體實(shí)施方式
對(duì)本發(fā)明的方法進(jìn)行詳細(xì)描述。如圖1所示,實(shí)現(xiàn)本發(fā)明方法的線程間數(shù)據(jù)交換組件主要包括三個(gè)部分1、緩存 數(shù)據(jù)結(jié)構(gòu);2、數(shù)據(jù)放入接口 ;3、數(shù)據(jù)獲取接口。數(shù)據(jù)提供線程通過(guò)調(diào)用數(shù)據(jù)放入接口,將數(shù) 據(jù)放入緩存中,數(shù)據(jù)消費(fèi)線程通過(guò)調(diào)用數(shù)據(jù)獲取接口讀取緩存中的數(shù)據(jù),內(nèi)部具有多個(gè)數(shù) 據(jù)緩存塊實(shí)現(xiàn)快速的數(shù)據(jù)交換。需要注意的是,線程間數(shù)據(jù)交換組件只支持單向的數(shù)據(jù)交 換,如果要支持雙向的數(shù)據(jù)交換,需實(shí)現(xiàn)兩套線程間數(shù)據(jù)交換組件,分別支持兩個(gè)不同方向 的數(shù)據(jù)交換。線程間數(shù)據(jù)交換組件的緩存數(shù)據(jù)結(jié)構(gòu)中,預(yù)先分配n+1個(gè)大小為blocksize的緩 存塊,其中η和blocksize都是可配置的參數(shù)。這n+1個(gè)緩存塊中有η個(gè)緩存塊用于循環(huán) 放入數(shù)據(jù)。當(dāng)數(shù)據(jù)提供線程調(diào)用數(shù)據(jù)放入接口時(shí),如果當(dāng)前緩存塊的剩余空間大于需要放 入的數(shù)據(jù)大小,那么直接將數(shù)據(jù)放入當(dāng)前緩存塊即可,否則判斷下一個(gè)緩存塊是否是空塊, 如果是,則將當(dāng)前緩存塊移動(dòng)到下一個(gè)緩存塊,并將數(shù)據(jù)放入當(dāng)前緩存塊中,如果否,則需 要等待數(shù)據(jù)消費(fèi)線程獲取數(shù)據(jù),使得下一個(gè)緩存塊為空塊時(shí),再將當(dāng)前緩存塊移動(dòng)到下一 個(gè)緩存塊,并將數(shù)據(jù)放入當(dāng)前緩存塊中。而另外一個(gè)緩存塊稱(chēng)作置換塊,則用于獲取數(shù)據(jù)時(shí) 與存有數(shù)據(jù)的緩存塊進(jìn)行置換。數(shù)據(jù)消費(fèi)線程調(diào)用獲取數(shù)據(jù)接口時(shí),置換塊是空的,假設(shè)η 個(gè)緩存塊中最早的有數(shù)據(jù)的緩存塊為緩存塊k,那么緩存塊k將與置換塊的內(nèi)容進(jìn)行置換, 置換塊內(nèi)變成最早的有數(shù)據(jù)的緩存塊內(nèi)容,而緩存塊k變成置換塊的內(nèi)容,即為空。然后, 數(shù)據(jù)消費(fèi)線程就可以直接訪問(wèn)置換塊獲得其中的數(shù)據(jù)了。由于數(shù)據(jù)提供線程和數(shù)據(jù)消費(fèi)線程訪問(wèn)共享內(nèi)存,需要提供高效的線程間通信和 同步機(jī)制。為此,本發(fā)明方法定義了三個(gè)變量數(shù)據(jù)可放事件、數(shù)據(jù)可取事件和操作臨界區(qū)。 數(shù)據(jù)可放事件描述線程間數(shù)據(jù)交換組件中是否有未滿的緩存塊,可以用于放入數(shù)據(jù);數(shù)據(jù) 可取事件描述線程間數(shù)據(jù)交換組件中是否有存有數(shù)據(jù)的緩存塊,可以用于獲取數(shù)據(jù);操作 臨界區(qū)用于數(shù)據(jù)提供線程和數(shù)據(jù)消費(fèi)線程對(duì)η個(gè)緩存塊進(jìn)行訪問(wèn)操作時(shí)實(shí)現(xiàn)同步。線程間數(shù)據(jù)交換組件的初始化過(guò)程如下首先,根據(jù)配置參數(shù)η,分配n+1個(gè)緩存 塊;然后,設(shè)置每個(gè)緩存塊已有數(shù)據(jù)大小為0,即為空緩存塊;第三,將最后一個(gè)緩存塊設(shè)置 為置換塊;最后,創(chuàng)建數(shù)據(jù)可放事件和數(shù)據(jù)可取事件,初始化操作臨界區(qū)。當(dāng)數(shù)據(jù)提供線程調(diào)用數(shù)據(jù)放入接口時(shí),首先進(jìn)入操作臨界區(qū),檢查當(dāng)前緩存塊是 否還有足夠的空間放入數(shù)據(jù),如果空間足夠,則將數(shù)據(jù)放入當(dāng)前緩存塊,離開(kāi)操作臨界區(qū)并 返回成功;否則,觸發(fā)數(shù)據(jù)可取事件,判斷下一個(gè)緩存塊是否為空,如果下一個(gè)緩存塊為空, 則將當(dāng)前緩存塊移動(dòng)到下一個(gè)緩存塊,將數(shù)據(jù)放入當(dāng)前緩存塊,離開(kāi)操作臨界區(qū)并返回成 功,否則,重置數(shù)據(jù)可放事件,離開(kāi)操作臨界區(qū),等待數(shù)據(jù)可放事件,等待超時(shí)時(shí)間為可設(shè)置 的參數(shù),如果等待超時(shí),則返回失敗,否則重新進(jìn)入操作臨界區(qū),并將數(shù)據(jù)放入緩存塊中,并 返回成功。當(dāng)數(shù)據(jù)消費(fèi)線程調(diào)用數(shù)據(jù)獲取接口時(shí),首先等待數(shù)據(jù)可取事件,等待超時(shí)時(shí)間為 可設(shè)置的參數(shù),無(wú)論等待超時(shí)或者成功,都將進(jìn)入操作臨界區(qū),判斷是否存在有數(shù)據(jù)的緩存 塊,如果存在有數(shù)據(jù)的緩存塊,則將置換塊中的數(shù)據(jù)清空,并與最早的有數(shù)據(jù)的緩存塊進(jìn)行 置換,如果除了置換塊之外不存在有數(shù)據(jù)的緩存塊,則重置數(shù)據(jù)可取事件,最后觸發(fā)數(shù)據(jù)可放事件,離開(kāi)操作臨界區(qū)并將置換塊的指針?lè)祷?;如果不存在有?shù)據(jù)的緩存塊,則重置數(shù)據(jù) 可取事件,并返回空指針。1、線程間數(shù)據(jù)交換組件的實(shí)現(xiàn)方法如下緩存塊結(jié)構(gòu)體定義
typedef struct StructDataExchangeBlock
{
WORD wDataLen;
BYTE IpData[DATA_EXCHANGE_BLOCK_SIZE];
}DataExchangeBlock ;其中,wDataLen為該緩存塊中已放入數(shù)據(jù)的長(zhǎng)度,如果為0,則表示該緩存塊為空 緩存塊,IpData為存放數(shù)據(jù)的內(nèi)存區(qū)域,DATA—EXCHANGE—BLOCK—SUE可根據(jù)軟件系統(tǒng)需求 定義的緩存塊大小參數(shù)。注意置換塊的結(jié)構(gòu)體與緩存塊的結(jié)構(gòu)體定義一致。線程間數(shù)據(jù)交換組件定義如下
class CDataExchangePipe
public:
CDataExchangePipe(long IDataBufFerCount = 1000); virtual CDataExchangePipe();
BOOL PutData(void* pData, WORD wDataLen, DWORD nTimeOut = 1); DataExchangeBlock* GetDataExchangeBlock(DWORD nTimeOut = 1);
private:
long m—IDataBufferCount; void* m_pBuffer;
DataExchangeBlock* * m_ppDataBuffers; HANDLE m—hDataAvailableEvent; HANDLE m_hBufferAvailableEvent; CRITICALSECTION m_Critical Section; long m—IFirstIndex; long m—ICurrentIndex;
};
其中,定義了四個(gè)公共方法。CDataExchangePipe 和 CDataExchangePipe 為構(gòu)造函數(shù)和析構(gòu)函數(shù);PutData為數(shù)據(jù)放入接口方法,供數(shù)據(jù)提供線程調(diào)用; GetDataExchangeBlock為數(shù)據(jù)獲取接口方法,供數(shù)據(jù)消費(fèi)線程調(diào)用。另外,還定義了八個(gè)私有成員變量。mJDataBufferCount為緩存塊個(gè)數(shù)(不包 括置換塊),即η ;m_pBuffer為mJDataBufferCount個(gè)緩存塊和1個(gè)置換塊所在的大內(nèi) 存指針;m_ppDataBuffers為緩存塊指針數(shù)據(jù),第m_lDataBufferCount+l個(gè)元素為置換 土夬指針;m_hDataAvaiIableEvent 是數(shù)據(jù)可取事件句柄;m_hBufferAvaiIableEvent 是數(shù) 據(jù)可放事件句柄;m_Criticalkcti0n是操作臨界區(qū);m_lFirS ndex為最早緩存塊;m_ ICurrentIndex為當(dāng)前緩存塊。參見(jiàn)圖4,本發(fā)明線程間數(shù)據(jù)交換組件初始化方法實(shí)現(xiàn)如下CDataExchangePipe的析構(gòu)函數(shù)為初始化方法,具體定義如下CDataExchangePipe(long IDataBufferCount = 1000);其中的參數(shù)IDataBufferCoimt為線程間數(shù)據(jù)交換組件中緩存塊的個(gè)數(shù)。初始化方法的具體實(shí)現(xiàn)代碼如下m—IDataBufferCount = IDataBufferCount;m_pBuffer = malloc(sizeof(DataExchangeBlock) * (m lDataBufferCount + 1));m_ppDataBufFers = (DataExchangeBlock**) malloc(sizeof(DataExchangeBlock*) * (mlDataBufferCount + 1));m ppDataBufFers
= (DataExchangeBlock*)m pBuffer;m_ppDataBufFers
->wDataLen = 0;for (int i=l;i<=m_lDataBufferCount;i++){~m_ppDataBuffers[i] = m_ppDataBufFers[i-1 ] + 1;m_ppDataBuffers[i]->wDataLen = 0;}m—hDataAvailableEvent = CreateEvent(NULL, TRUE, FALSE, NULL);m—hBufferAvailableEvent = CreateEvent(NULL, TRUE, TRUE, NULL);m—IFirstIndex = 0;m_lCurrentIndex = 0;InitializeCriticalSection(&m_CriticalSection);其中,第1行設(shè)置緩存塊的個(gè)數(shù)nUDataBufferCoimt ;第2行分配一個(gè)大內(nèi)存 塊,大小為nUDataBufferCoimt+l個(gè)緩存塊的大?。坏?行分配指針數(shù)組,可存放m_ IDataBufferCount+l個(gè)塊指針,前m_lDataBufferCount個(gè)指針為緩存塊指針,最后一個(gè)指 針為置換塊指針;4 10行將初始化指針數(shù)組,指向大內(nèi)存塊的相應(yīng)位置,并將緩存塊和 置換塊的數(shù)據(jù)大小設(shè)置為O ;第11、12行分別創(chuàng)建數(shù)據(jù)可取事件nuhDataAvailableEvent 和數(shù)據(jù)可放事件 m_hBufferAvai 1 ab 1 eEvent ;第 13、14 行初始化 m_lFirs ndex 和 m_ lCurrentlndex為零,即最早緩存塊和當(dāng)前緩存塊都設(shè)置為第一個(gè)緩存塊(空塊);第15行 初始化操作臨界區(qū)m_Criticalkction。3、數(shù)據(jù)放入接口方法實(shí)現(xiàn)數(shù)據(jù)放入接口方法具體定義如下B00L PutData(void*pData, WORD wDataLen, DWORD nTimeOut);
其中,pData為需要放入的數(shù)據(jù)存放的內(nèi)存地址,wDataLen為需要放入的數(shù)據(jù)大 小,nTimeOut為等待超時(shí)時(shí)間。該接口的返回值為布爾類(lèi)型,返回值為T(mén)RUE,表示放入成 功,否則表示放入失敗。數(shù)據(jù)放入接口方法具體實(shí)現(xiàn)代碼如下BOOLbRes = FALSE;BOOL b TimeOut = FALSE; P] do{EnterCriticalSection(&m—CriticalSecti on);if (m_ppDataBuffers[m_lCurrentIndex]->wDataLen + wDataLen >= DATA—EXCHANGE—BLOCK_STZE){— —SetEvent(m—hDataAvailableEvent);if ((m ICurrentIndex + 1) % m IDataBufferCount == m IFirstIndex){ResetEvent(m_hBufferAvailableEvent);LeaveCritical Section(&m—Critical Section);bTimeOut = (WaitForSingleObject(m_hBufferAvailableEvent, nTimeOut) != WAIT OBJECT 0);continue;}else{m ICurrentIndex = (m ICurrentIndex + 1) % m lDataBufferCount;} P。] }memcpy(m_ppDataBuffers[m_lCurrentIndex]->lpData+ m_ppDataBuffers[m_lCurrentIndex]->wDataLen, pData, wDataLen);m_ppDataBuffers[m lCurrentIndex]->wDataLen 十=wDataLen;LeaveCriticalSecti on(&m_Criti cal Secti on); P4] bRes = TRUE;
P5] } while (IbTimeOut || bRes); [26] return bRes;該方法的具體實(shí)現(xiàn)中,首先將bRes和bTimeOut初始設(shè)置為FALSE,表明數(shù)據(jù)尚 未放置成功且尚未等待超時(shí);第5行進(jìn)入操作臨界區(qū);第6行判斷當(dāng)前緩存塊是否有足夠 的空間放置需要放入的數(shù)據(jù),如果空間足夠,則到第21行執(zhí)行,將數(shù)據(jù)放入當(dāng)前緩存塊,否 則,先觸發(fā)數(shù)據(jù)可取事件,以通知數(shù)據(jù)消費(fèi)線程能夠獲取數(shù)據(jù);在當(dāng)前緩存塊空間不夠的前 提下,第9行判斷下一個(gè)緩存塊是否是最早緩存塊,如果是,說(shuō)明已經(jīng)沒(méi)有可用的空緩存塊 了,則在第11、12行分別重置數(shù)據(jù)可放事件、離開(kāi)操作臨界區(qū),并在第13行等待數(shù)據(jù)可放事 件,如果等待超時(shí),則在第25行循環(huán)條件不成立,在第沈行返回放入失敗,如果等待成功, 則從第5行開(kāi)始繼續(xù)執(zhí)行;如果第9行發(fā)現(xiàn)下一個(gè)緩存塊不是最早緩存塊,說(shuō)明下一個(gè)緩存 塊是空塊,則在第18行將當(dāng)前緩存塊移動(dòng)到下一個(gè)緩存塊,并繼續(xù)第21行執(zhí)行,將數(shù)據(jù)放 入當(dāng)前緩存塊;第21行將需要放入的數(shù)據(jù)拷貝到當(dāng)前緩存塊中;第22行將當(dāng)前數(shù)據(jù)塊的數(shù)據(jù)大小增加新放入數(shù)據(jù)的大??;第23行離開(kāi)操作臨界區(qū);第M行將bRes賦值為T(mén)RUE, 表明數(shù)據(jù)放入成功。參見(jiàn)圖2,為數(shù)據(jù)放入操作流程。4、數(shù)據(jù)獲取接口方法實(shí)現(xiàn)數(shù)據(jù)獲取接口方法具體定義如下DataExchangeBlock氺GetDataExchangeBlock(DWORD nTimeOut);其中,nTimeOut為等待超時(shí)時(shí)間。該接口的返回值為置換塊指針,如果返回值為 非空值,則可以訪問(wèn)該置換塊中的數(shù)據(jù),否則,表示獲取數(shù)據(jù)失敗。數(shù)據(jù)獲取接口方法具體實(shí)現(xiàn)代碼如下WaitForSingleObject(m_hDataAvailableEvent, nTimeOut);EnterCriti calS ecti on(&m—Criti calS ecti on);if (m_ppDataBufFers[m_lFirstIndex]->wDataLen == 0){—ResetEvent(m_hDataAvailableEvent);LeaveCriticalSection(&m—CriticalSection);return NULL;}DataExchangeBlock* p;m_ppDataBuffers[m_lDataBufFerCount]->wDataLen = 0;p = m_ppDataBuffers[m—IFirstIndex];m_ppDataBuffers[m_lFirstIndex] = m_ppDataBuffers[m—IDataBufferCount];m_ppDataBuffers[m—IDataBufferCount] = p;if (m_l CurrentIndex == m—IFirstIndex){——m_l CurrentIndex = 0;m—IFirstIndex = 0;ResetEvent(m_ hDataAvailableEvent);}— po]else
PI]{m—IFirstIndex = (m—IFirstIndex + 1) % m—IDataBufferCount;}“一SetEvent(mhBufferAvailableEvent);LeaveCritical Section(&m—Critical Section);return m_ppDataBuffers [m lDataBufferCount]; 該方法的具體實(shí)現(xiàn)中,第1行等待數(shù)據(jù)可取事件,不管等待是否成功,都在第2行 進(jìn)入操作臨界區(qū);第3行判斷最早緩存塊的數(shù)據(jù)大小是否為零,如果等于零,則在第5 7 行中重置數(shù)據(jù)可取事件、離開(kāi)操作臨界區(qū)并返回空指針,否則,則進(jìn)行數(shù)據(jù)獲取操作;第10 行將置換塊的數(shù)據(jù)大小設(shè)置為零,即清空置換塊中的數(shù)據(jù);第11、12、13行將置換塊和最早 緩存塊進(jìn)行置換;第14行判斷當(dāng)前緩存塊是否等于最早緩存塊,如果相等,說(shuō)明所有數(shù)據(jù) 都已經(jīng)取完,那么在第16 18行將當(dāng)前緩存塊和最早緩存塊都恢復(fù)為初始狀態(tài),即第一個(gè) 緩存塊,并重置數(shù)據(jù)可取事件,如果不相等,則將最早置換塊移動(dòng)到下一個(gè)緩存塊;第M行 觸發(fā)數(shù)據(jù)可放事件;第25行離開(kāi)操作臨界區(qū);第沈行返回置換塊指針。參見(jiàn)圖3,為數(shù)據(jù)放入操作流程。
權(quán)利要求
1.一種實(shí)時(shí)快速的線程間數(shù)據(jù)交換方法,包括以下步驟1)數(shù)據(jù)提供線程和數(shù)據(jù)消費(fèi)線程共享的內(nèi)存中設(shè)置一個(gè)緩存數(shù)據(jù)結(jié)構(gòu),所述緩存數(shù)據(jù) 結(jié)內(nèi)部包括多個(gè)數(shù)據(jù)緩存塊;2)數(shù)據(jù)提供線程通過(guò)調(diào)用數(shù)據(jù)放入接口,將數(shù)據(jù)放入數(shù)據(jù)緩存塊中;3)數(shù)據(jù)消費(fèi)線程通過(guò)調(diào)用數(shù)據(jù)獲取接口讀取數(shù)據(jù)緩存塊中的數(shù)據(jù),實(shí)現(xiàn)快速的數(shù)據(jù)交換。
2.如權(quán)利要求1所述的實(shí)時(shí)快速的線程間數(shù)據(jù)交換方法,其特征在于所述緩存數(shù)據(jù) 結(jié)構(gòu)中,包括n+1個(gè)緩存塊,其中η個(gè)緩存塊用于循環(huán)放入數(shù)據(jù);第η+1個(gè)緩存塊稱(chēng)作置換 塊,用于獲取數(shù)據(jù)時(shí)與存有數(shù)據(jù)的緩存塊進(jìn)行置換。
3.如權(quán)利要求1或2所述的實(shí)時(shí)快速的線程間數(shù)據(jù)交換方法,其特征在于采用數(shù)據(jù) 可放事件描述緩存數(shù)據(jù)結(jié)構(gòu)中是否有用于放入數(shù)據(jù)的未滿緩存塊;數(shù)據(jù)可取事件描述緩存 數(shù)據(jù)結(jié)構(gòu)中是否有存有數(shù)據(jù)的緩存塊用于獲取數(shù)據(jù);操作臨界區(qū)用于數(shù)據(jù)提供線程和數(shù)據(jù) 消費(fèi)線程對(duì)η個(gè)緩存塊進(jìn)行訪問(wèn)操作時(shí)實(shí)現(xiàn)同步。
4.如權(quán)利要求3所述的實(shí)時(shí)快速的線程間數(shù)據(jù)交換方法,其特征在于當(dāng)數(shù)據(jù)提供線 程調(diào)用數(shù)據(jù)放入接口時(shí),首先進(jìn)入操作臨界區(qū),檢查當(dāng)前緩存塊是否還有足夠的空間放入 數(shù)據(jù),如果空間足夠,則將數(shù)據(jù)放入當(dāng)前緩存塊,離開(kāi)操作臨界區(qū),數(shù)據(jù)放入成功;
5.如權(quán)利要求4所述的實(shí)時(shí)快速的線程間數(shù)據(jù)交換方法,其特征在于如果當(dāng)前緩存 塊沒(méi)有足夠的空間放入數(shù)據(jù),觸發(fā)數(shù)據(jù)可取事件,判斷下一個(gè)緩存塊是否為空,如果下一個(gè) 緩存塊為空,則將當(dāng)前緩存塊移動(dòng)到下一個(gè)緩存塊,將數(shù)據(jù)放入當(dāng)前緩存塊。
6.如權(quán)利要求5所述的實(shí)時(shí)快速的線程間數(shù)據(jù)交換方法,其特征在于如果下一個(gè)緩 存塊不為空,等待數(shù)據(jù)可放事件,重新進(jìn)入操作臨界區(qū),并將數(shù)據(jù)放入緩存塊中。
7.如權(quán)利要求6所述的實(shí)時(shí)快速的線程間數(shù)據(jù)交換方法,其特征在于等待數(shù)據(jù)可放 事件的時(shí)間為可設(shè)置的參數(shù),如果等待超時(shí),則數(shù)據(jù)放入失敗。
8.如權(quán)利要求3所述的實(shí)時(shí)快速的線程間數(shù)據(jù)交換方法,其特征在于當(dāng)數(shù)據(jù)消費(fèi)線 程調(diào)用數(shù)據(jù)獲取接口時(shí),首先等待數(shù)據(jù)可取事件,進(jìn)入操作臨界區(qū),如果判斷存在有數(shù)據(jù)的 緩存塊,則將置換塊中的數(shù)據(jù)清空,并與置換塊之外有數(shù)據(jù)的緩存塊進(jìn)行置換,最后觸發(fā)數(shù) 據(jù)可放事件,離開(kāi)操作臨界區(qū),數(shù)據(jù)獲取成功。
9.如權(quán)利要求8所述的實(shí)時(shí)快速的線程間數(shù)據(jù)交換方法,其特征在于如果置換塊之 外不存在有數(shù)據(jù)的緩存塊,則重置數(shù)據(jù)可取事件。
10.如權(quán)利要求8所述的實(shí)時(shí)快速的線程間數(shù)據(jù)交換方法,其特征在于如果判斷不存 在有數(shù)據(jù)的緩存塊,則重置數(shù)據(jù)可取事件,數(shù)據(jù)獲取失敗。
全文摘要
本發(fā)明公開(kāi)了一種線程間數(shù)據(jù)交換方法,涉及信息技術(shù)領(lǐng)域,該方法包括以下步驟1)數(shù)據(jù)提供線程和數(shù)據(jù)消費(fèi)線程共享的內(nèi)存中設(shè)置一個(gè)緩存數(shù)據(jù)結(jié)構(gòu),所述緩存數(shù)據(jù)結(jié)內(nèi)部包括多個(gè)數(shù)據(jù)緩存塊;2)數(shù)據(jù)提供線程通過(guò)調(diào)用數(shù)據(jù)放入接口,將數(shù)據(jù)放入數(shù)據(jù)緩存塊中;3)數(shù)據(jù)消費(fèi)線程通過(guò)調(diào)用數(shù)據(jù)獲取接口讀取數(shù)據(jù)緩存塊中的數(shù)據(jù),實(shí)現(xiàn)快速的數(shù)據(jù)交換。該方法既保證了線程間數(shù)據(jù)交換的實(shí)時(shí)性,同時(shí)又能夠保證線程間進(jìn)行海量數(shù)據(jù)交換時(shí)的吞吐量,可以支持進(jìn)程內(nèi)線程之間進(jìn)行大量數(shù)據(jù)的交換。在進(jìn)行零星數(shù)據(jù)交換時(shí),數(shù)據(jù)能夠在非常短的時(shí)間內(nèi)完成交換。
文檔編號(hào)G06F12/08GK102129396SQ20111005197
公開(kāi)日2011年7月20日 申請(qǐng)日期2011年3月4日 優(yōu)先權(quán)日2011年3月4日
發(fā)明者劉洋, 王宏安, 王永炎, 羅雄飛, 駱小芳 申請(qǐng)人:中國(guó)科學(xué)院軟件研究所
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
曲周县| 永丰县| 衡山县| 宜兰县| 江油市| 射阳县| 昭平县| 固镇县| 英吉沙县| 张家界市| 汉沽区| 滦平县| 安吉县| 博乐市| 东方市| 开封县| 志丹县| 隆昌县| 丽水市| 台州市| 三穗县| 江陵县| 专栏| 湘阴县| 洪洞县| 潞城市| 西充县| 北海市| 江津市| 古浪县| 松滋市| 渝中区| 蕉岭县| 正宁县| 嘉禾县| 东乌珠穆沁旗| 手游| 灵武市| 麻栗坡县| 巍山| 武鸣县|