基于消息隊(duì)列的共享內(nèi)存寫入及讀取方法和系統(tǒng)的制作方法
【專利摘要】本發(fā)明公開了一種基于消息隊(duì)列的共享內(nèi)存寫入及讀取方法和系統(tǒng),共享內(nèi)存寫入方法包括:采用所述消息隊(duì)列執(zhí)行多線程進(jìn)隊(duì)push以及單線程出隊(duì)pop的操作;將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存。本發(fā)明解決了線程間通信時(shí)阻塞的問題,減少了資源消耗,充分利用了系統(tǒng)資源,提高了處理速度,從而提高了服務(wù)器吞吐量。
【專利說明】基于消息隊(duì)列的共享內(nèi)存寫入及讀取方法和系統(tǒng)
【技術(shù)領(lǐng)域】
[0001]本申請涉及計(jì)算機(jī)通信的【技術(shù)領(lǐng)域】,特別是涉及一種基于消息隊(duì)列的共享內(nèi)存寫入方法,一種基于消息隊(duì)列的共享內(nèi)存讀取方法,一種基于消息隊(duì)列的共享內(nèi)存讀寫方法,一種基于消息隊(duì)列的共享內(nèi)存寫入系統(tǒng),一種基于消息隊(duì)列的共享內(nèi)存讀取系統(tǒng),一種基于消息隊(duì)列的共享內(nèi)存讀寫系統(tǒng)。
【背景技術(shù)】
[0002]吞吐量是指在一次性能測試過程中網(wǎng)絡(luò)上傳輸?shù)臄?shù)據(jù)量的總和。對于交互式應(yīng)用來說,吞吐量指標(biāo)反映的是服務(wù)器承受的壓力,在容量規(guī)劃的測試中,吞吐量指標(biāo)說明的是系統(tǒng)級(jí)別的負(fù)載能力。隨著用戶業(yè)務(wù)量的不斷增長以及企業(yè)數(shù)據(jù)的不斷積累,對服務(wù)器的吞吐量要求也越來越高。
[0003]服務(wù)器為了提高吞吐量,可以采用進(jìn)程分離的方式,即邏輯處理和I/O處理分離,I/O處理包括I/O網(wǎng)絡(luò)線程處理I/O事件,即數(shù)據(jù)包的接收和發(fā)送,連接的建立和維護(hù)等。邏輯處理包括邏輯線程對收到的數(shù)據(jù)包進(jìn)行邏輯處理。
[0004]現(xiàn)有技術(shù)中,通常I/O網(wǎng)絡(luò)線程和邏輯線程之間是通過數(shù)據(jù)包隊(duì)列來交換信息,簡單來說就是一個(gè)生產(chǎn)者-消費(fèi)者模式,在工作中,可能會(huì)碰到這樣一種情況:某個(gè)模塊負(fù)責(zé)產(chǎn)生數(shù)據(jù),這些數(shù)據(jù)由另一個(gè)模塊來負(fù)責(zé)處理,此處的模塊是廣義的,可以是類、函數(shù)、線程、進(jìn)程等等。產(chǎn)生數(shù)據(jù)的模塊,就形象地稱為生產(chǎn)者;而處理數(shù)據(jù)的模塊,就稱為消費(fèi)者。在生產(chǎn)者與消費(fèi)者之間在加個(gè)緩沖區(qū),形象地稱之為倉庫,生產(chǎn)者負(fù)責(zé)往倉庫里存放商品,而消費(fèi)者負(fù)責(zé)從倉庫里取出商品,這就構(gòu)成了生產(chǎn)者-消費(fèi)者模式。由于數(shù)據(jù)包隊(duì)列是多個(gè)線程在共享訪問,包括多個(gè)線程寫入數(shù)據(jù)以及多個(gè)線程讀取數(shù)據(jù),因此要解決多線程同步與互斥的問題,多線程同步是指線程之間所具有的一種制約關(guān)系,一個(gè)線程的執(zhí)行依賴另一個(gè)線程的消息,當(dāng)它沒有得到另一個(gè)線程的消息時(shí)應(yīng)等待,直到消息到達(dá)時(shí)才被喚醒。多線程互斥是指對于共享的進(jìn)程系統(tǒng)資源,在各單個(gè)線程訪問時(shí)的排它性。當(dāng)有若干個(gè)線程都要使用某一共享資源時(shí),任何時(shí)刻最多只允許一個(gè)線程去使用,其它要使用該資源的線程必須等待,直到占用資源者釋放該資源。通常采用在多個(gè)線程寫入數(shù)據(jù)以及多個(gè)線程讀取數(shù)據(jù)時(shí)分別加互斥鎖的方式,意味著每次訪問都要加鎖。然而加鎖會(huì)造成永遠(yuǎn)只能有一個(gè)線程在工作,以此執(zhí)行寫操作或者執(zhí)行讀操作,意味著總會(huì)有線程被阻塞,增加了資源消耗并且無法充分利用資源,從而影響服務(wù)器吞吐量。
【發(fā)明內(nèi)容】
[0005]鑒于上述問題,提出了本發(fā)明以便提供一種克服上述問題或者至少部分地解決上述問題的基于消息隊(duì)列的共享內(nèi)存寫入及讀取方法和系統(tǒng),以解決進(jìn)程間通信時(shí)阻塞的問題,減少資源消耗,充分利用系統(tǒng)資源,提高處理速度,從而提高服務(wù)器吞吐量。
[0006]依據(jù)本發(fā)明的一個(gè)方面,提供了一種基于消息隊(duì)列的共享內(nèi)存寫入方法,所述消息隊(duì)列包括第一消息隊(duì)列,所述方法包括:[0007]采用所述消息隊(duì)列執(zhí)行多線程進(jìn)隊(duì)push以及單線程出隊(duì)pop的操作;
[0008]將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存;
[0009]其中,所述多線程進(jìn)隊(duì)push的操作包括:
[0010]判斷所述消息隊(duì)列是否已滿;
[0011]若否,則分別計(jì)算n個(gè)線程進(jìn)隊(duì)push的偏移量;所述n為大于或等于I的正整數(shù);
[0012]依據(jù)所述n個(gè)線程進(jìn)隊(duì)push的偏移量,分別計(jì)算所述n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置Pos ;
[0013]所述n個(gè)線程分別在其進(jìn)隊(duì)push的實(shí)際位置Pos執(zhí)行進(jìn)隊(duì)push操作;
[0014]其中,所述將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存的步驟包括:
[0015]獲得所述單線程出隊(duì)pop的數(shù)據(jù)及其長度;
[0016]檢查所述數(shù)據(jù)的長度是否超出共享內(nèi)存的長度界限;
[0017]若否,則獲取所述共享內(nèi)存的讀偏移指針pRead和寫偏移指針pWrite ;
[0018]依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置,并判斷所述數(shù)據(jù)是否可寫;
[0019]若是,則在所述寫入位置寫入所述數(shù)據(jù)。
[0020]可選地,在采用所述消息隊(duì)列執(zhí)行多線程進(jìn)隊(duì)push以及單線程出隊(duì)pop的操作的步驟之前還包括:
[0021]在存在多個(gè)消息隊(duì)列時(shí),選定用于當(dāng)前通信的第一消息隊(duì)列。
[0022]可選地,所述選定用于當(dāng)前通信的第一消息隊(duì)列的步驟包括:
[0023]讀取所述數(shù)據(jù)的協(xié)議中的上下文參數(shù)intnld ;
[0024]采用所述上下文參數(shù)intnld對所述多個(gè)消息隊(duì)列的個(gè)數(shù)取模;
[0025]提取所述取模的值對應(yīng)的消息隊(duì)列為用于當(dāng)前通信的第一消息隊(duì)列。
[0026]可選地,所述判斷消息隊(duì)列是否已滿的子步驟進(jìn)一步包括:
[0027]讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值;
[0028]遞減所述CanWriteCount 的值;
[0029]若獲得遞減后的CanWriteCount的值為0,則判定所述消息隊(duì)列為已滿,否則,判定所述消息隊(duì)列為未滿。
[0030]可選地,所述分別計(jì)算n個(gè)線程進(jìn)隊(duì)push的偏移量的子步驟進(jìn)一步包括:
[0031]讀取進(jìn)隊(duì)push的偏移量Pushpos的值;
[0032]針對所述n個(gè)線程迭代增加所述Pushpos的值,分別獲得所述n個(gè)線程進(jìn)隊(duì)push
的偏移量。
[0033]可選地,所述分別計(jì)算所述n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置Pos的子步驟進(jìn)一步包括:
[0034]讀取所述消息隊(duì)列大小參數(shù)Size的值;
[0035]采用所述Size的值對所述Pushpos的值取模,獲得對應(yīng)的n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置Pos。
[0036]可選地,在所述n個(gè)線程分別在其進(jìn)隊(duì)push的實(shí)際位置執(zhí)行進(jìn)隊(duì)push操作的子步驟之后,所述多線程進(jìn)隊(duì)push的操作還包括:
[0037]讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值;[0038]按照所述n個(gè)線程進(jìn)隊(duì)push的操作,迭代增加所述CanReadCount的值。
[0039]可選地,所述單線程出隊(duì)pop的操作的子步驟為:
[0040]單個(gè)線程依次在所述消息隊(duì)列中執(zhí)行出隊(duì)pop操作。
[0041]可選地,所述多線程進(jìn)隊(duì)push的操作還包括:
[0042]若所述消息隊(duì)列已滿,則禁止執(zhí)行進(jìn)隊(duì)push的操作。
[0043]可選地,所述將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存的步驟還包括:
[0044]若所述數(shù)據(jù)的長度超出共享內(nèi)存的長度界限,則禁止寫入。
[0045]可選地,所述依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置,并判斷所述數(shù)據(jù)是否可寫的子步驟進(jìn)一步包括:
[0046]依據(jù)所述寫偏移指針pWrite確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置;
[0047]當(dāng)所述讀偏移指針pRead和寫偏移指針pWrite處于同一位置時(shí),判定所述數(shù)據(jù)可與。
[0048]可選地,所述依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置,并判斷所述數(shù)據(jù)是否可寫的子步驟還進(jìn)一步包括:
[0049]依據(jù)所述寫偏移指針pWrite確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置;
[0050]當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite后面的位置時(shí),設(shè)置可寫數(shù)據(jù)的長度小于或等于allsize-pRead+pWrite-head,其中allsize為共享內(nèi)存的長度,所述head為文件頭的長度;
[0051]判斷所述數(shù)據(jù)的長度是否小于或等于所述可寫數(shù)據(jù)的長度;
[0052]若是,則判定所述數(shù)據(jù)可寫;
[0053]若否,則判定所述數(shù)據(jù)不可寫。
[0054]可選地,所述依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置,并判斷所述數(shù)據(jù)是否可寫的子步驟還進(jìn)一步包括:
[0055]依據(jù)所述寫偏移指針pWrite確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置;
[0056]當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),設(shè)置可寫數(shù)據(jù)的長度小于或等于pRead-pWrite ;
[0057]判斷所述數(shù)據(jù)的長度是否小于或等于所述可寫數(shù)據(jù)的長度;
[0058]若是,則判定所述數(shù)據(jù)可寫;
[0059]若否,則判定所述數(shù)據(jù)不可寫。
[0060]可選地,所述獲取所述共享內(nèi)存的讀偏移指針pRead和寫偏移指針pWrite的子步驟進(jìn)一步包括:
[0061]獲得所述共享內(nèi)存的映射文件,所述映射文件包括文件頭;
[0062]從所述文件頭中讀取寫偏移指針pWrite ;
[0063]從所述文件頭中讀取讀偏移指針pRead并快照到臨時(shí)變量中。
[0064]可選地,所述在所述數(shù)據(jù)所在共享內(nèi)存的位置寫入所述數(shù)據(jù)的子步驟進(jìn)一步包括:[0065]當(dāng)所述讀偏移指針pRead和寫偏移指針pWrite處于同一位置時(shí),或,當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite后面的位置時(shí),則從當(dāng)前寫偏移指針pWrite位置開始寫入所述數(shù)據(jù);
[0066]當(dāng)寫入到所述共享內(nèi)存尾部的位置時(shí),判斷所述數(shù)據(jù)是否已全部寫入;
[0067]若否,則從所述共享內(nèi)存中文件頭結(jié)束的位置開始繼續(xù)寫入所述數(shù)據(jù),直至在所述讀偏移指針PRead位置之前寫入全部的數(shù)據(jù)。
[0068]可選地,所述在所述數(shù)據(jù)所在共享內(nèi)存的位置寫入所述數(shù)據(jù)子步驟進(jìn)一步包括:
[0069]當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),則從當(dāng)前寫偏移指針PWrite位置開始寫入所述數(shù)據(jù);
[0070]在所述讀偏移指針pRead位置之前寫入全部的數(shù)據(jù)。
[0071]可選地,采用內(nèi)存拷貝memcpy的方式寫入所述數(shù)據(jù)。
[0072]根據(jù)本發(fā)明的另一方面,提供了一種基于消息隊(duì)列的共享內(nèi)存讀取方法,所述消息隊(duì)列包括第二消息隊(duì)列,所述方法包括:
[0073]從共享內(nèi)存中讀取數(shù)據(jù);
[0074]將讀出的數(shù)據(jù)通過單線程進(jìn)隊(duì)push的操作壓入所述第二消息隊(duì)列,同時(shí),采用所述第二消息隊(duì)列執(zhí)行多線程出隊(duì)pop的操作;
[0075]其中,所述從共享內(nèi)存中讀取數(shù)據(jù)的步驟包括:
[0076]定位待讀取數(shù)據(jù)所在共享內(nèi)存的位置;
[0077]獲得所述待讀取數(shù)據(jù)的長度;
[0078]獲取所述共享內(nèi)存的讀偏移指針pRead和寫偏移指針pWrite ;
[0079]依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述待讀取數(shù)據(jù)的長度,判斷所述待讀取數(shù)據(jù)是否可讀;
[0080]若是,則從所述待讀取數(shù)據(jù)所在共享內(nèi)存的位置,讀出所述待讀取數(shù)據(jù);
[0081]其中,所述多線程出隊(duì)pop的操作包括:
[0082]判斷所述消息隊(duì)列是否已空;
[0083]若否,則分別計(jì)算n個(gè)線程出隊(duì)pop的偏移量;所述n為大于或等于I的正整數(shù);
[0084]依據(jù)所述n個(gè)線程出隊(duì)pop的偏移量,分別計(jì)算所述n個(gè)線程出隊(duì)pop的實(shí)際位置 Pos ;
[0085]所述n個(gè)線程分別在其出隊(duì)pop的實(shí)際位置執(zhí)行出隊(duì)pop操作。
[0086]可選地,所述從共享內(nèi)存中讀取數(shù)據(jù)的步驟還包括:
[0087]若所述數(shù)據(jù)不可讀,則返回?cái)?shù)據(jù)為空。
[0088]可選地,所述依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,判斷所述數(shù)據(jù)是否可讀的子步驟進(jìn)一步包括:
[0089]當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite后面的位置時(shí),設(shè)置可讀數(shù)據(jù)的長度小于或等于pWrite-pRead ;
[0090]判斷所述數(shù)據(jù)的長度是否小于或等于所述可讀數(shù)據(jù)的長度;
[0091]若是,則判定所述數(shù)據(jù)可讀;
[0092]若否,則判定所述數(shù)據(jù)不可讀。
[0093]可選地,所述依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,判斷所述數(shù)據(jù)是否可讀的子步驟還進(jìn)一步包括:
[0094]當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),設(shè)置可讀數(shù)據(jù)的長度小于或等于allsize-pRead+pWrite-head,其中,所述allsize為共享內(nèi)存的長度,所述head為文件頭的長度;
[0095]判斷所述數(shù)據(jù)的長度是否小于或等于所述可讀數(shù)據(jù)的長度;
[0096]若是,則判定所述數(shù)據(jù)可讀;
[0097]若否,則判定所述數(shù)據(jù)不可讀。
[0098]可選地,所述依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,判斷所述數(shù)據(jù)是否可讀的子步驟還進(jìn)一步包括:
[0099]當(dāng)所述讀偏移指針pRead和寫偏移指針pWrite處于同一位置時(shí),則判定所述數(shù)據(jù)不可讀。
[0100]可選地,所述獲取所述共享內(nèi)存的讀偏移指針pRead和寫偏移指針pWrite的子步驟進(jìn)一步包括:
[0101]獲得所述共享內(nèi)存的映射文件,所述映射文件包括文件頭;
[0102]從所述文件頭中讀取讀偏移指針pRead ;
[0103]從所述文件頭中讀取寫偏移指針pWrite并快照到臨時(shí)變量中。
[0104]可選地,所述從所述數(shù)據(jù)所在共享內(nèi)存的位置,讀出所述數(shù)據(jù)的子步驟進(jìn)一步包括:
[0105]當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite后面的位置時(shí),則從當(dāng)前讀偏移指針PRead位置開始讀出所述數(shù)據(jù);
[0106]在不超過所述寫偏移指針pWrite位置讀出全部的數(shù)據(jù)。
[0107]可選地,所述從所述數(shù)據(jù)所在共享內(nèi)存的位置,讀出所述數(shù)據(jù)的子步驟進(jìn)一步包括:
[0108]當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),則從當(dāng)前讀偏移指針PRead位置開始讀出所述數(shù)據(jù);
[0109]當(dāng)讀取至所述共享內(nèi)存尾部的位置時(shí),判斷所述數(shù)據(jù)是否已全部讀出;
[0110]若否,則從所述共享內(nèi)存中文件頭結(jié)束的位置開始繼續(xù)讀出所述數(shù)據(jù),直至在不超過所述寫偏移指針PWrite位置讀出全部的數(shù)據(jù)。
[0111]可選地,采用內(nèi)存拷貝memcpy的方式讀出所述數(shù)據(jù)。
[0112]可選地,所述判斷消息隊(duì)列是否已空的子步驟進(jìn)一步包括:
[0113]讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值;
[0114]遞減所述CanReadCount 的值;
[0115]若獲得遞減后的CanReadCount的值為0,則判定所述消息隊(duì)列為已空,否則,判定所述消息隊(duì)列為未空。
[0116]可選地,所述分別計(jì)算n個(gè)線程出隊(duì)pop的偏移量的子步驟進(jìn)一步包括:
[0117]讀取出隊(duì)pop的偏移量Poppos的值;
[0118]針對所述n個(gè)線程迭代增加所述Poppos的值,分別獲得所述n個(gè)線程出隊(duì)pop的
偏移量。
[0119]可選地,所述分別計(jì)算所述n個(gè)線程出隊(duì)pop的實(shí)際位置Pos的子步驟還進(jìn)一步包括:
[0120]讀取所述消息隊(duì)列大小參數(shù)Size的值;
[0121]采用所述Size的值對所述Poppos的值取模,獲得對應(yīng)的n個(gè)線程出隊(duì)pop的實(shí)際位置Pos。
[0122]可選地,在所述n個(gè)線程分別在其出隊(duì)pop的實(shí)際位置執(zhí)行出隊(duì)pop操作的步驟之后,還包括:
[0123]讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值;
[0124]按照所述n個(gè)線程出隊(duì)pop的操作,迭代增加所述CanWriteCount的值。
[0125]可選地,所述單線程進(jìn)隊(duì)push的操作進(jìn)一步包括:
[0126]單個(gè)線程依次在所述消息隊(duì)列中執(zhí)行進(jìn)隊(duì)push操作。
[0127]可選地,所述多線程出隊(duì)pop的操作還進(jìn)一步包括:
[0128]若所述消息隊(duì)列已空,則禁止執(zhí)行出隊(duì)pop的操作。
[0129]根據(jù)本發(fā)明的另一方面,提供了一種基于消息隊(duì)列的共享內(nèi)存讀寫的方法,所述消息隊(duì)列包括第一消息隊(duì)列和第二消息隊(duì)列,所述方法包括:
[0130]采用第一消息隊(duì)列執(zhí)行多線程進(jìn)隊(duì)push以及單線程出隊(duì)pop的操作;
[0131]將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存;
[0132]從所述共享內(nèi)存中讀取數(shù)據(jù);
[0133]將讀出的數(shù)據(jù)通過單線程進(jìn)隊(duì)push的操作壓入所述第二消息隊(duì)列,同時(shí),采用所述第二消息隊(duì)列執(zhí)行多線程出隊(duì)pop的操作;
[0134]其中,所述多線程進(jìn)隊(duì)push的操作包括:
[0135]讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值;
[0136]遞減所述CanWriteCount 的值;
[0137]若獲得遞減后的CanWriteCount的值不為0,則判定所述消息隊(duì)列為未滿;
[0138]在所述消息隊(duì)列未滿時(shí),分別計(jì)算n個(gè)線程進(jìn)隊(duì)push的偏移量;所述n為大于或等于I的正整數(shù);
[0139]依據(jù)所述n個(gè)線程進(jìn)隊(duì)push的偏移量,分別計(jì)算所述n個(gè)線程進(jìn)隊(duì)push的實(shí)際
位置;
[0140]所述n個(gè)線程分別在其進(jìn)隊(duì)push的實(shí)際位置執(zhí)行進(jìn)隊(duì)push操作;
[0141]讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值;
[0142]按照所述n個(gè)線程進(jìn)隊(duì)push的操作,迭代增加所述CanReadCount的值;
[0143]其中,所述多線程出隊(duì)pop的操作包括:
[0144]讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值;
[0145]遞減所述CanReadCount 的值;
[0146]若獲得遞減后的CanReadCount的值不為0,則判定所述消息隊(duì)列為未空;
[0147]在所述消息隊(duì)列未空時(shí),分別計(jì)算n個(gè)線程出隊(duì)pop的偏移量;所述n為大于或等于I的正整數(shù);
[0148]依據(jù)所述n個(gè)線程出隊(duì)pop的偏移量,分別計(jì)算所述n個(gè)線程出隊(duì)pop的實(shí)際位置;
[0149]所述n個(gè)線程分別在其出隊(duì)pop的實(shí)際位置執(zhí)行出隊(duì)pop操作;[0150]讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值;
[0151]按照所述n個(gè)線程出隊(duì)pop的操作,迭代增加所述CanWriteCount的值;
[0152]其中,將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存的步驟包括:
[0153]獲得所述單線程出隊(duì)pop的數(shù)據(jù)及其長度;
[0154]檢查所述數(shù)據(jù)的長度是否超出共享內(nèi)存的長度界限;
[0155]若否,則獲取所述共享內(nèi)存的讀偏移指針pRead和寫偏移指針pWrite ;
[0156]依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置,并判斷所述數(shù)據(jù)是否可寫;
[0157]若是,則在所述寫入位置寫入所述數(shù)據(jù);
[0158]其中,所述從共享內(nèi)存中讀取數(shù)據(jù)的步驟包括:
[0159]定位待讀取數(shù)據(jù)所在共享內(nèi)存的位置;
[0160]獲得所述待讀取數(shù)據(jù)的長度;
[0161]獲取所述共享內(nèi)存的讀偏移指針pRead和寫偏移指針pWrite ;
[0162]依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述待讀取數(shù)據(jù)的長度,判斷所述待讀取數(shù)據(jù)是否可讀;
[0163]若是,則從所述待讀取數(shù)據(jù)所在共享內(nèi)存的位置,讀出所述待讀取數(shù)據(jù)。
[0164]根據(jù)本發(fā)明的另一方面,提供了一種基于消息隊(duì)列的共享內(nèi)存寫入系統(tǒng),所述消息隊(duì)列包括第一消息隊(duì)列,所述系統(tǒng)包括:
[0165]多線程進(jìn)隊(duì)push模塊及單線程出隊(duì)pop模塊,用于采用所述消息隊(duì)列執(zhí)行多線程進(jìn)隊(duì)push以及單線程出隊(duì)pop的操作;
[0166]數(shù)據(jù)寫入模塊,用于將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存;
[0167]其中,所述多線程進(jìn)隊(duì)push模塊包括:
[0168]第一判斷子模塊,用于判斷所述消息隊(duì)列是否已滿;
[0169]進(jìn)隊(duì)push偏移量計(jì)算子模塊,用于在消息隊(duì)列未滿時(shí),分別計(jì)算n個(gè)線程進(jìn)隊(duì)push的偏移量;所述n為大于或等于I的正整數(shù);
[0170]進(jìn)隊(duì)push的實(shí)際位置Pos計(jì)算子模塊,用于依據(jù)所述n個(gè)線程進(jìn)隊(duì)push的偏移量,分別計(jì)算所述n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置Pos ;
[0171]操作進(jìn)隊(duì)push子模塊,用于所述n個(gè)線程分別在其進(jìn)隊(duì)push的實(shí)際位置Pos執(zhí)行進(jìn)隊(duì)push操作;
[0172]其中,所述數(shù)據(jù)寫入模塊包括:
[0173]數(shù)據(jù)及其長度獲得子模塊,用于獲得所述單線程出隊(duì)pop的數(shù)據(jù)及其長度;
[0174]界限檢查子模塊,用于檢查所述數(shù)據(jù)的長度是否超出共享內(nèi)存的長度界限;
[0175]第一指針獲取子模塊,用于在所述數(shù)據(jù)的長度未超出共享內(nèi)存的長度界限時(shí),獲取所述共享內(nèi)存的讀偏移指針PRead和寫偏移指針pWrite ;
[0176]可寫判斷子模塊,用于依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置,并判斷所述數(shù)據(jù)是否可寫;
[0177]寫入子模塊,用于在數(shù)據(jù)可寫時(shí),在所述寫入位置寫入所述數(shù)據(jù)。
[0178]可選地,所述系統(tǒng)還包括:
[0179]第一消息隊(duì)列選定模塊,用于在存在多個(gè)消息隊(duì)列時(shí),選定用于當(dāng)前通信的第一消息隊(duì)列。
[0180]可選地,所述第一消息隊(duì)列選定模塊包括:
[0181]上下文參數(shù)讀取子模塊,用于讀取所述數(shù)據(jù)的協(xié)議中的上下文參數(shù)intnld ;
[0182]取模子模塊,用于采用所述上下文參數(shù)intnld對所述多個(gè)消息隊(duì)列的個(gè)數(shù)取模;
[0183]提取子模塊,用于提取所述取模的值對應(yīng)的消息隊(duì)列為用于當(dāng)前通信的第一消息隊(duì)列。
[0184]可選地,所述第一判斷子模塊進(jìn)一步包括:
[0185]可寫計(jì)數(shù)參數(shù)讀取子模塊,用于讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值;
[0186]可寫計(jì)數(shù)參數(shù)遞減子模塊,用于遞減所述CanWriteCount的值;
[0187]第一判斷子模塊,用于在獲得遞減后的CanWriteCount的值為0,則判定所述消息隊(duì)列為已滿,否則,判定所述消息隊(duì)列為未滿。
[0188]可選地,所述進(jìn)隊(duì)push偏移量計(jì)算子模塊進(jìn)一步包括:
[0189]偏移量Pushpos讀取子模塊,用于讀取進(jìn)隊(duì)push的偏移量Pushpos的值;
[0190]偏移量Pushpos獲得子模塊,用于針對所述n個(gè)線程迭代增加所述Pushpos的值,分別獲得所述n個(gè)線程進(jìn)隊(duì)push的偏移量。
[0191]可選地,所述進(jìn)隊(duì)push的實(shí)際位置Pos計(jì)算子模塊進(jìn)一步包括:
[0192]第一大小參數(shù)Size讀取子模塊,用于讀取所述消息隊(duì)列大小參數(shù)Size的值;
[0193]進(jìn)隊(duì)push的實(shí)際位置Pos獲得子模塊,用于獲得對應(yīng)的n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置Pos。
[0194]可選地,所述多線程進(jìn)隊(duì)push子模塊還進(jìn)一步包括:
[0195]可讀計(jì)數(shù)參數(shù)讀取子模塊,讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值;
[0196]可讀計(jì)數(shù)參數(shù)讀迭代增加子模塊,按照所述n個(gè)線程進(jìn)隊(duì)push的操作,迭代增加所述 CanReadCount 的值。
[0197]可選地,所述單線程出隊(duì)pop模塊進(jìn)一步包括:
[0198]出隊(duì)pop子模塊,用于單個(gè)線程依次在所述消息隊(duì)列中執(zhí)行出隊(duì)pop操作。
[0199]可選地,所述多線程進(jìn)隊(duì)push模塊還進(jìn)一步包括:
[0200]進(jìn)隊(duì)push的操作禁止子模塊,用于在所述消息隊(duì)列已滿時(shí),禁止執(zhí)行進(jìn)隊(duì)push的操作。
[0201]可選地,所述數(shù)據(jù)寫入模塊還進(jìn)一步包括:
[0202]禁止寫入子模塊,用于在所述數(shù)據(jù)的長度超出共享內(nèi)存的長度界限,則禁止寫入。
[0203]可選地,所述可寫判斷子模塊進(jìn)一步包括:
[0204]第一寫入位置確定子模塊,用于依據(jù)所述寫偏移指針pWrite確定所述數(shù)據(jù)在共孕內(nèi)存中的與入位置;
[0205]第一可寫判定子模塊,用于當(dāng)所述讀偏移指針pRead和寫偏移指針pWrite處于同一位置時(shí),判定所述數(shù)據(jù)可寫。
[0206]可選地,所述可寫判斷子模塊還進(jìn)一步包括:
[0207]第二寫入位置確定子模塊,用于依據(jù)所述寫偏移指針pWrite確定所述數(shù)據(jù)在共孕內(nèi)存中的與入位置;
[0208]第一可寫數(shù)據(jù)長度設(shè)置子模塊,用于在所述讀偏移指針pRead處于所述寫偏移指針pWrite后面的位置時(shí),設(shè)置可寫數(shù)據(jù)的長度小于或等于allsize-pWrite+pRead-head,其中allsize為共享內(nèi)存的長度,所述head為文件頭的長度;
[0209]第三判斷子模塊,用于判斷所述數(shù)據(jù)的長度是否小于或等于所述可寫數(shù)據(jù)的長度;
[0210]第二可寫判定子模塊,用于所述數(shù)據(jù)的長度小于或等于所述可寫數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)可寫;
[0211]第一不可寫判定子模塊,用于所述數(shù)據(jù)的長度大于所述可寫數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)不可寫。
[0212]可選地,所述可寫判斷子模塊還進(jìn)一步包括:
[0213]第三寫入位置確定子模塊,用于依據(jù)所述寫偏移指針pWrite確定所述數(shù)據(jù)在共孕內(nèi)存中的與入位置;
[0214]第二可寫數(shù)據(jù)長度設(shè)置子模塊,用于在所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),設(shè)置可寫數(shù)據(jù)的長度小于或等于pRead-pWrite ;
[0215]第四判斷子模塊,用于判斷所述數(shù)據(jù)的長度是否小于或等于所述可寫數(shù)據(jù)的長度;
[0216]第三可寫判定子模塊,用于所述數(shù)據(jù)的長度小于或等于所述可寫數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)可寫;
[0217]第二不可寫判定子模塊,用于所述數(shù)據(jù)的長度大于所述可寫數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)不可寫。
[0218]可選地,所述第一指針獲取子模塊進(jìn)一步包括:
[0219]第一映射文件獲得子模塊,用于獲得所述共享內(nèi)存的映射文件,所述映射文件包括文件頭;
[0220]第一寫偏移指針pWrite讀取子模塊,用于從所述文件頭中讀取寫偏移指針pWrite ;
[0221]第一讀偏移指針pRead讀取子模塊,用于從所述文件頭中讀取讀偏移指針pRead并快照到臨時(shí)變量中。
[0222]可選地,所述寫入子模塊進(jìn)一步包括:
[0223]第一開始寫入子模塊,用于在所述讀偏移指針pRead和寫偏移指針pWrite處于同一位置時(shí),或,在所述讀偏移指針PRead處于所述寫偏移指針pWrite后面的位置時(shí),則從當(dāng)前寫偏移指針PWrite位置開始寫入所述數(shù)據(jù);
[0224]尾部寫入判斷子模塊,用于在寫入到所述共享內(nèi)存尾部的位置時(shí),判斷所述數(shù)據(jù)是否已全部寫入;
[0225]第一全部寫入子模塊,用于所述數(shù)據(jù)未全部寫入時(shí),從所述共享內(nèi)存中文件頭結(jié)束的位置開始繼續(xù)寫入所述數(shù)據(jù),直至在所述讀偏移指針PRead位置之前寫入全部的數(shù)據(jù)。
[0226]可選地,所述寫入子模塊進(jìn)一步包括:
[0227]第二開始寫入子模塊,用于在所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),則從當(dāng)前寫偏移指針PWrite位置開始寫入所述數(shù)據(jù);
[0228]第二全部寫入子模塊,用于在所述讀偏移指針pRead位置之前寫入全部的數(shù)據(jù)。[0229]可選地,采用內(nèi)存拷貝memcpy的方式寫入所述數(shù)據(jù)
[0230]根據(jù)本發(fā)明的另一方面,提供了一種基于消息隊(duì)列的共享內(nèi)存讀取系統(tǒng),所述消息隊(duì)列包括第二消息隊(duì)列,所述系統(tǒng)包括:
[0231]數(shù)據(jù)讀取模塊,用于從共享內(nèi)存中讀取數(shù)據(jù);
[0232]單線程進(jìn)隊(duì)push模塊及多線程出隊(duì)pop模塊,用于將讀出的數(shù)據(jù)通過單線程進(jìn)隊(duì)push的操作壓入所述第二消息隊(duì)列,同時(shí),采用所述第二消息隊(duì)列執(zhí)行多線程出隊(duì)pop的操作;
[0233]其中,所述數(shù)據(jù)讀取模塊包括:
[0234]定位子模塊,用于定位待讀取數(shù)據(jù)所在共享內(nèi)存的位置;
[0235]數(shù)據(jù)長度獲得子模塊,用于獲得所述待讀取數(shù)據(jù)的長度;
[0236]第二指針獲取子模塊,用于獲取所述共享內(nèi)存的讀偏移指針pRead和寫偏移指針pWrite ;
[0237]可讀判斷子模塊,用于依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,判斷所述待讀取數(shù)據(jù)是否可讀;
[0238]讀取子模塊,用于在所述數(shù)據(jù)可讀時(shí),從所述數(shù)據(jù)所在共享內(nèi)存的位置,讀出所述待讀取數(shù)據(jù)。
[0239]其中,所述多線程出隊(duì)pop模塊包括:
[0240]第二判斷子模塊,用于判斷所述消息隊(duì)列是否已空;
[0241]出隊(duì)pop的偏移量計(jì)算子模塊,用于在消息隊(duì)列未空時(shí),分別計(jì)算n個(gè)線程出隊(duì)pop的偏移量;所述n為大于或等于I的正整數(shù);
[0242]出隊(duì)pop的實(shí)際位置Pos計(jì)算子模塊,用于依據(jù)所述n個(gè)線程出隊(duì)pop的偏移量,分別計(jì)算所述n個(gè)線程出隊(duì)pop的實(shí)際位置Pos ;
[0243]操作出隊(duì)pop子模塊,用于所述n個(gè)線程分別在其出隊(duì)pop的實(shí)際位置執(zhí)行出隊(duì)pop操作。
[0244]可選地,所述數(shù)據(jù)讀取模塊還進(jìn)一步包括:
[0245]返回子模塊,用于在所述數(shù)據(jù)不可讀時(shí),返回?cái)?shù)據(jù)為空。
[0246]可選地,所述可讀判斷子模塊進(jìn)一步包括:
[0247]第一可讀數(shù)據(jù)長度設(shè)置子模塊,用于在所述讀偏移指針pRead處于所述寫偏移指針pWrite后面的位置時(shí),設(shè)置可讀數(shù)據(jù)的長度小于或等于pWrite-pRead ;
[0248]第一判斷子模塊,用于判斷所述數(shù)據(jù)的長度是否小于或等于所述可讀數(shù)據(jù)的長度;
[0249]第一可讀判定子模塊,用于所述數(shù)據(jù)的長度小于或等于所述可讀數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)可讀;
[0250]第一不可讀判定子模塊,用于所述數(shù)據(jù)的長度大于所述可讀數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)不可讀。
[0251]可選地,所述可讀判斷子模塊還進(jìn)一步包括:
[0252]第二可讀數(shù)據(jù)長度設(shè)置子模塊,用于當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),設(shè)置可讀數(shù)據(jù)的長度小于或等于allsize-pRead+pWrite-head,其中,所述allsize為共享內(nèi)存的長度,所述head為文件頭的長度;[0253]第二判斷子模塊,用于判斷所述數(shù)據(jù)的長度是否小于或等于所述可讀數(shù)據(jù)的長度;
[0254]第二可讀判定子模塊,用于所述數(shù)據(jù)的長度小于或等于所述可讀數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)可讀;
[0255]第二不可讀判定子模塊,用于所述數(shù)據(jù)的長度大于所述可讀數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)不可讀。
[0256]可選地,所述可讀判斷子模塊還進(jìn)一步包括:
[0257]第三不可讀判定子模塊,用于在所述讀偏移指針pRead和寫偏移指針pWrite處于同一位置時(shí),判定所述數(shù)據(jù)不可讀。
[0258]可選地,所述第二指針獲取子模塊進(jìn)一步包括:
[0259]第二映射文件獲得子模塊,用于獲得所述共享內(nèi)存的映射文件,所述映射文件包括文件頭;
[0260]第二讀偏移指針pRead讀取子模塊,用于從所述文件頭中讀取讀偏移指針pRead ;
[0261]第二寫偏移指針pWrite讀取子模塊,用于從所述文件頭中讀取寫偏移指針pWrite并快照到臨時(shí)變量中。
[0262]可選地,所述讀取子模塊進(jìn)一步包括:
[0263]第一開始讀取子模塊,用于在所述讀偏移指針pRead處于所述寫偏移指針pWrite后面的位置時(shí),從當(dāng)前讀偏移指針PRead位置開始讀出所述數(shù)據(jù);
[0264]第一全部讀取子模塊,用于在不超過所述寫偏移指針pWrite位置讀出全部的數(shù)據(jù)。
[0265]可選地,所述讀取模塊進(jìn)一步包括:
[0266]第二開始讀取子模塊,用于在所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),從當(dāng)前讀偏移指針PRead位置開始讀出所述數(shù)據(jù);
[0267]尾部讀取判斷子模塊,用于在讀取至所述共享內(nèi)存尾部的位置時(shí),判斷所述數(shù)據(jù)是否已全部讀出;
[0268]第二全部讀取子模塊,用于在所述數(shù)據(jù)未全部讀出時(shí),從所述共享內(nèi)存中文件頭結(jié)束的位置開始繼續(xù)讀出所述數(shù)據(jù),直至在不超過所述寫偏移指針PWrite位置讀出全部的數(shù)據(jù)。
[0269]可選地,采用內(nèi)存拷貝memcpy的方式讀出所述數(shù)據(jù)。
[0270]可選地,所述第二判斷子模塊進(jìn)一步包括:
[0271]可讀計(jì)數(shù)參數(shù)讀取子模塊,用于讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值;
[0272]可讀計(jì)數(shù)參數(shù)遞減子模塊,用于遞減所述CanReadCount的值;
[0273]第二判斷子模塊,用于在獲得遞減后的CanReadCount的值為0,則判定所述消息隊(duì)列為已空,否則,判定所述消息隊(duì)列為未空。
[0274]可選地,所述出隊(duì)pop的偏移量計(jì)算子模塊還進(jìn)一步包括:
[0275]偏移量Poppos讀取子模塊,用于讀取出隊(duì)pop的偏移量Poppos的值;
[0276]偏移量Poppos獲得子模塊,用于針對所述n個(gè)線程迭代增加所述Poppos的值,分別獲得所述n個(gè)線程出隊(duì)pop的偏移量。
[0277]可選地,所述出隊(duì)pop的實(shí)際位置Pos計(jì)算子模塊進(jìn)一步包括:[0278]第二大小參數(shù)讀取子模塊,用于讀取所述消息隊(duì)列大小參數(shù)Size的值;
[0279]出隊(duì)pop的實(shí)際位置Pos計(jì)算子模塊,用于采用所述Size的值對所述Poppos的值取模,獲得對應(yīng)的n個(gè)線程出隊(duì)pop的實(shí)際位置Pos。
[0280]可選地,所述多線程出隊(duì)pop模塊還進(jìn)一步包括:
[0281]可寫計(jì)數(shù)參數(shù)讀取子模塊,用于讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值;
[0282]可寫計(jì)數(shù)參數(shù)迭代增加子模塊,用于按照所述n個(gè)線程出隊(duì)pop的操作,迭代增加所述 CanWriteCount 的值。
[0283]可選地,所述單線程進(jìn)隊(duì)push模塊進(jìn)一步包括:
[0284]進(jìn)隊(duì)push子模塊,用于單個(gè)線程依次在所述消息隊(duì)列中執(zhí)行進(jìn)隊(duì)push操作。
[0285]可選地,所述多線程出隊(duì)pop模塊還進(jìn)一步包括:
[0286]出隊(duì)pop的操作禁止子模塊,用于在所述消息隊(duì)列已空時(shí),則禁止執(zhí)行出隊(duì)pop的操作。
[0287]根據(jù)本發(fā)明的另一方面,提供了一種基于消息隊(duì)列的共享內(nèi)存處理的系統(tǒng),所述消息隊(duì)列包括第一消息隊(duì)列和第二消息隊(duì)列,所述方法包括:
[0288]第一進(jìn)隊(duì)push模塊和第一出隊(duì)pop模塊,用于采用第一消息隊(duì)列執(zhí)行多線程進(jìn)隊(duì)push以及單線程出隊(duì)pop的操作;
[0289]共享內(nèi)存寫入模塊,用于將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存;
[0290]共享內(nèi)存讀取模塊,用于從所述共享內(nèi)存中讀取數(shù)據(jù);
[0291]第二進(jìn)隊(duì)push模塊和第二出隊(duì)pop模塊,用于將讀出的數(shù)據(jù)通過單線程進(jìn)隊(duì)push的操作壓入所述第二消息隊(duì)列,同時(shí),采用所述第二消息隊(duì)列執(zhí)行多線程出隊(duì)pop的操作;
[0292]其中,所述第一進(jìn)隊(duì)push模塊包括:
[0293]CanffriteCount參數(shù)讀取子模塊,用于讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值;
[0294]CanffriteCount參數(shù)遞減子模塊,用于遞減所述CanWriteCount的值;
[0295]第三判斷子模塊,用于在獲得遞減后的CanWriteCount的值不為0,則判定所述消息隊(duì)列為未滿;
[0296]push的偏移量計(jì)算子模塊,用于在所述消息隊(duì)列未滿時(shí),分別計(jì)算n個(gè)線程進(jìn)隊(duì)push的偏移量;所述n為大于或等于I的正整數(shù);
[0297]push的實(shí)際位置計(jì)算子模塊,用于依據(jù)所述n個(gè)線程進(jìn)隊(duì)push的偏移量,分別計(jì)算所述n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置;
[0298]push操作執(zhí)行子模塊,用于所述n個(gè)線程分別在其進(jìn)隊(duì)push的實(shí)際位置執(zhí)行進(jìn)隊(duì)push操作;
[0299]CanReadCount參數(shù)讀取子模塊,用于讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值;
[0300]CanReadCount參數(shù)迭加子模塊,用于按照所述n個(gè)線程進(jìn)隊(duì)push的操作,迭代增加所述CanReadCount的值;
[0301 ] 其中,所述第二出隊(duì)pop模塊包括:
[0302]CanReadCount參數(shù)讀取子模塊,用于讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值;
[0303]CanReadCount參數(shù)遞減子模塊,用于遞減所述CanReadCount的值;
[0304]第四判斷子模塊,用于在獲得遞減后的CanReadCount的值不為0,則判定所述消息隊(duì)列為未空;[0305]pop的偏移量計(jì)算子模塊,用于在所述消息隊(duì)列未空時(shí),分別計(jì)算n個(gè)線程出隊(duì)pop的偏移量;所述n為大于或等于I的正整數(shù);
[0306]pop的實(shí)際位置計(jì)算子模塊,用于依據(jù)所述n個(gè)線程出隊(duì)pop的偏移量,分別計(jì)算所述n個(gè)線程出隊(duì)pop的實(shí)際位置;
[0307]pop操作執(zhí)行子模塊,用于所述n個(gè)線程分別在其出隊(duì)pop的實(shí)際位置執(zhí)行出隊(duì)pop操作;
[0308]CanffriteCount參數(shù)讀取子模塊,用于讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值;
[0309]CanffriteCount參數(shù)迭加子模塊,用于按照所述n個(gè)線程出隊(duì)pop的操作,迭代增加所述CanWriteCount的值;
[0310]其中,共享內(nèi)存寫入模塊包括:
[0311]數(shù)據(jù)獲得子模塊,用于獲得所述單線程出隊(duì)pop的數(shù)據(jù)及其長度;
[0312]檢查子模塊,用于檢查所述數(shù)據(jù)的長度是否超出共享內(nèi)存的長度界限;
[0313]第三指針獲取子模塊,用于在所述數(shù)據(jù)的長度未超出共享內(nèi)存的長度界限時(shí),獲取所述共享內(nèi)存的讀偏移指針PRead和寫偏移指針pWrite ;
[0314]數(shù)據(jù)可寫判斷子模塊,用于依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置,并判斷所述數(shù)據(jù)是否可寫;
[0315]寫入數(shù)據(jù)子模塊,用于在數(shù)據(jù)可寫時(shí),在所述寫入位置寫入所述數(shù)據(jù);
[0316]其中,所述共享內(nèi)存讀取模塊包括:
[0317]數(shù)據(jù)定位子模塊,用于定位待讀取數(shù)據(jù)所在共享內(nèi)存的位置;
[0318]長度獲得子模塊,用于獲得所述待讀取數(shù)據(jù)的長度;
[0319]第四指針獲取子模塊,用于獲取所述共享內(nèi)存的讀偏移指針pRead和寫偏移指針pWrite ;
[0320]數(shù)據(jù)可讀判斷子模塊,用于依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,判斷所述待讀取數(shù)據(jù)是否可讀;
[0321]讀取數(shù)據(jù)子模塊,用于在所述數(shù)據(jù)可讀時(shí),從所述數(shù)據(jù)所在共享內(nèi)存的位置,讀出所述待讀取數(shù)據(jù)。
[0322]與現(xiàn)有技術(shù)相比,本發(fā)明包括以下優(yōu)點(diǎn):
[0323]本發(fā)明通過采用第一消息隊(duì)列執(zhí)行多線程進(jìn)隊(duì)push以及單線程出隊(duì)pop的操作,或,采用第二消息隊(duì)列執(zhí)行單線程進(jìn)隊(duì)push以及多線程出隊(duì)pop的操作,可以保證多線程訪問操作不碰撞,避免使用互斥鎖來解決多線程并發(fā)爭用安全性的問題,并且,多線程進(jìn)隊(duì)push和單線程出隊(duì)pop的操作可以同時(shí)進(jìn)行,解決了線程間通信時(shí)阻塞的問題,減少了資源消耗,充分利用了系統(tǒng)資源,提高了處理速度,從而提高了服務(wù)器吞吐量。
[0324]本發(fā)明通過將所述數(shù)據(jù)寫入共享內(nèi)存,可以不加鎖的控制寫入數(shù)據(jù),避免了加鎖造成的阻塞的問題,從而減少資源消耗,充分利用系統(tǒng)資源,提高處理速度,提高服務(wù)器吞吐量。
[0325]本發(fā)明通過從所述共享內(nèi)存中讀取數(shù)據(jù),可以不加鎖的控制讀出數(shù)據(jù),避免了加鎖造成的阻塞的問題,從而減少資源消耗,充分利用系統(tǒng)資源,提高處理速度,提高服務(wù)器
吞吐量。
[0326]本發(fā)明通過選定第一消息隊(duì)列,均衡了各個(gè)消息隊(duì)列上的負(fù)載,提高了處理速度,有效避免出現(xiàn)某個(gè)消息隊(duì)列負(fù)載遠(yuǎn)遠(yuǎn)大于其他消息隊(duì)列的負(fù)載的情況,從而減少各個(gè)CPU之間使用率的差值,提高服務(wù)器吞吐量。
[0327]本發(fā)明通過判斷消息隊(duì)列已滿時(shí),禁止執(zhí)行進(jìn)隊(duì)push的操作,保證了寫入數(shù)據(jù)時(shí)的安全性與準(zhǔn)確性,以及,通過判斷消息隊(duì)列已空時(shí),禁止執(zhí)行出隊(duì)pop的操作,保證了讀取數(shù)據(jù)時(shí)的安全性與準(zhǔn)確性,從而保證多線程訪問成功,解決了線程間通信時(shí)阻塞的問題,從而提高服務(wù)器吞吐量。
[0328]本發(fā)明通過迭代增加可讀計(jì)數(shù)參數(shù)CanReadCount,保證了線程執(zhí)行讀操作時(shí)可讀原子數(shù)目的準(zhǔn)確性,以及,通過迭代增加可寫計(jì)數(shù)參數(shù)CanWriteCount,保證了線程執(zhí)行寫操作時(shí)可寫原子數(shù)目的準(zhǔn)確性,從而保證了線程間通信成功,減少資源消耗,充分利用系統(tǒng)資源,提高處理速度,從而提高服務(wù)器吞吐量。
[0329]本發(fā)明通過獲得所述共享內(nèi)存的映射文件,所述映射文件包括文件頭,從所述文件頭中讀取寫偏移指針pWrite并快照到臨時(shí)變量中,記錄了當(dāng)前寫偏移指針pWrite的位置,從而保證了在執(zhí)行當(dāng)前讀操作的內(nèi)存不會(huì)隨寫偏移指針PWrite的變化而被修改,以及,通過獲得所述共享內(nèi)存的映射文件,所述映射文件包括文件頭,從所述文件頭中讀取讀偏移指針PRead并快照到臨時(shí)變量中,記錄了當(dāng)前讀偏移指針pRead的位置,從而保證了在執(zhí)行當(dāng)前寫操作的內(nèi)存不會(huì)隨讀偏移指針PRead的變化而被修改,即讀操作和寫操作可以同時(shí)進(jìn)行,并且,保證了讀偏移指針PRead不會(huì)與寫偏移指針pWrite產(chǎn)生沖突,因此能夠充分利用系統(tǒng)資源,解決進(jìn)程間通信時(shí)阻塞的問題,減少資源消耗,從而提高服務(wù)器吞吐量。
[0330]本發(fā)明通過采用內(nèi)存拷貝memcpy的方式讀出所述數(shù)據(jù)的方式,能夠快速地將數(shù)據(jù)從共享內(nèi)存中讀出,以及,通過采用內(nèi)存拷貝memcpy的方式寫入所述數(shù)據(jù)的方式,能夠快速地將數(shù)據(jù)寫入共享內(nèi)存中,從而提高處理速度,提高服務(wù)器吞吐量。
[0331]上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說明書的內(nèi)容予以實(shí)施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點(diǎn)能夠更明顯易懂,以下特舉本發(fā)明的【具體實(shí)施方式】。
【專利附圖】
【附圖說明】
[0332]通過閱讀下文優(yōu)選實(shí)施方式的詳細(xì)描述,各種其他的優(yōu)點(diǎn)和益處對于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實(shí)施方式的目的,而并不認(rèn)為是對本發(fā)明的限制。而且在整個(gè)附圖中,用相同的參考符號(hào)表示相同的部件。在附圖中:
[0333]圖1示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種基于消息隊(duì)列的共享內(nèi)存寫入方法實(shí)施例I的步驟流程圖;
[0334]圖2示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種采用一個(gè)第一消息隊(duì)列通信的示意圖;
[0335]圖3示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種多線程進(jìn)隊(duì)push的示意圖;
[0336]圖4示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種內(nèi)存文件數(shù)據(jù)結(jié)構(gòu)的示意圖;
[0337]圖5示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種基于消息隊(duì)列的共享內(nèi)存讀取方法實(shí)施例的步驟流程圖;
[0338]圖6示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種數(shù)據(jù)的協(xié)議的示意圖;
[0339]圖7示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種多線程出隊(duì)pop的示意圖;
[0340]圖8示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種基于消息隊(duì)列的共享內(nèi)存讀寫方法實(shí)施例的步驟流程圖;
[0341]圖9示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種基于消息隊(duì)列的共享內(nèi)存寫入方法實(shí)施例2的步驟流程圖;
[0342]圖10示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種采用多個(gè)消息隊(duì)列通信的示意圖;
[0343]圖11示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種基于消息隊(duì)列的共享內(nèi)存寫入系統(tǒng)實(shí)施例的結(jié)構(gòu)框圖;
[0344]圖12示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種基于消息隊(duì)列的共享內(nèi)存讀取系統(tǒng)實(shí)施例的結(jié)構(gòu)框圖;
[0345]圖13示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種基于消息隊(duì)列的共享內(nèi)存讀寫系統(tǒng)實(shí)施例的結(jié)構(gòu)框圖。
【具體實(shí)施方式】
[0346]下面將參照附圖更詳細(xì)地描述本公開的示例性實(shí)施例。雖然附圖中顯示了本公開的示例性實(shí)施例,然而應(yīng)當(dāng)理解,可以以各種形式實(shí)現(xiàn)本公開而不應(yīng)被這里闡述的實(shí)施例所限制。相反,提供這些實(shí)施例是為了能夠更透徹地理解本公開,并且能夠?qū)⒈竟_的范圍完整的傳達(dá)給本領(lǐng)域的技術(shù)人員。
[0347]為使本領(lǐng)域技術(shù)人員更好地理解本發(fā)明,以下對本發(fā)明所涉及的相關(guān)技術(shù)進(jìn)行簡單說明。
[0348]消息隊(duì)列是在消息的傳輸過程中保存消息的容器,所謂消息是進(jìn)行傳送的數(shù)據(jù)單位。消息可以非常簡單,例如只包含文本字符串,也可以更復(fù)雜,可能包含嵌入對象。消息隊(duì)列在將消息從它的源中繼到它的目標(biāo)時(shí)充當(dāng)中間人。消息隊(duì)列的主要目的是提供路由并保證消息的傳遞;如果發(fā)送消息時(shí)接收者不可用,消息隊(duì)列會(huì)保留消息,直到可以成功地傳遞它。消息隊(duì)列是Microsoft的消息處理技術(shù),它在任何安裝了 Microsoft Windows的計(jì)算機(jī)組合中,為任何應(yīng)用程序提供消息處理和消息隊(duì)列功能,無論這些計(jì)算機(jī)是否在同一個(gè)網(wǎng)絡(luò)上或者是否同時(shí)聯(lián)機(jī)。
[0349]共享內(nèi)存指基于環(huán)形緩沖區(qū)的共享內(nèi)存,顧名思義環(huán)形緩沖區(qū)是環(huán)形的,所謂環(huán)形,就是用一個(gè)指針去訪問該緩沖區(qū)的最后一個(gè)內(nèi)存位置的后一位置時(shí)回到環(huán)形緩沖區(qū)的起點(diǎn)。環(huán)形緩沖區(qū)通常有一個(gè)讀指針和一個(gè)寫指針,讀指針指向環(huán)形緩沖區(qū)中可讀的緩沖區(qū),寫指針指向環(huán)形緩沖區(qū)中可寫的緩沖區(qū)。通過移動(dòng)讀指針和寫指針就可以實(shí)現(xiàn)緩沖區(qū)的數(shù)據(jù)讀取和寫入。在通常情況下,環(huán)形緩沖區(qū)的讀操作僅僅會(huì)影響讀指針,而寫操作僅僅會(huì)影響寫指針。
[0350]消息隊(duì)列和共享內(nèi)存都可以單獨(dú)的用于線程間的通信,當(dāng)消息隊(duì)列或共享內(nèi)存單獨(dú)地用于多線程寫入和多線程讀取時(shí),由于線程可以執(zhí)行進(jìn)程的任何代碼段,且線程的運(yùn)行是由系統(tǒng)調(diào)度自動(dòng)完成的,具有一定的不確定性,因此就有可能出現(xiàn)兩個(gè)線程同時(shí)對磁盤驅(qū)動(dòng)器進(jìn)行操作,從而出現(xiàn)操作錯(cuò)誤,因此要解決線程間對資源的并發(fā)爭用安全性的問題,通常采用加鎖的方式以解決上述問題,然而加鎖會(huì)阻塞其他線程,以保證在任一時(shí)刻只能有一個(gè)線程訪問該對象,從而造成程序效率大幅度的降低,資源消耗的增加,處理速度的降低,無法充分利用系統(tǒng)資源,服務(wù)器吞吐量大幅度的降低。
[0351]正是本專利發(fā)明人發(fā)現(xiàn)這一問題的嚴(yán)重性,創(chuàng)造性地提出本發(fā)明實(shí)施例的核心構(gòu)思之一在于,提出一種通信機(jī)制,可以實(shí)現(xiàn)采用消息隊(duì)列執(zhí)行多線程進(jìn)隊(duì)push以及單線程出隊(duì)pop的操作,和,采用消息隊(duì)列執(zhí)行單線程進(jìn)隊(duì)push以及多線程出隊(duì)pop的操作,以及,單線程讀寫的共享內(nèi)存,從而實(shí)現(xiàn)在對消息隊(duì)列和共享內(nèi)存不加鎖的情況下,同時(shí)執(zhí)行多線程進(jìn)隊(duì)push和多線程出隊(duì)pop操作,安全地完成線程間通信,并且,線程間沒有阻塞,從而能夠充分利用系統(tǒng)資源,提高服務(wù)器吞吐量。長期以來,本領(lǐng)域技術(shù)人員對于多線程并發(fā)爭用安全性的技術(shù)問題,普遍采用消息隊(duì)列或共享內(nèi)存在寫入數(shù)據(jù)和讀取數(shù)據(jù)時(shí)加鎖的方式完成線程間的通信。本專利發(fā)明人反其道而行之,采用本領(lǐng)域技術(shù)人員由于技術(shù)偏見而舍棄的技術(shù)手段,通過不加鎖的消息隊(duì)列采用原子操作,以及不加鎖的共享內(nèi)存采用單線程讀寫,因此,多線程寫入和多線程讀取之間的通信訪問操作不碰撞,從而解決多線程并發(fā)爭用安全性的技術(shù)問題。
[0352]參照圖1,示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種基于消息隊(duì)列的共享內(nèi)存寫入方法實(shí)施例1的步驟流程圖,所述消息隊(duì)列包括第一消息隊(duì)列,具體可以包括如下步驟:
[0353]步驟101,采用所述消息隊(duì)列執(zhí)行多線程進(jìn)隊(duì)push以及單線程出隊(duì)pop的操作;
[0354]參照圖2,示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種采用一個(gè)第一消息隊(duì)列通信的示意圖。如圖2所示,多個(gè)線程寫入數(shù)據(jù)至第一消息隊(duì)列,并通過第一消息隊(duì)列寫入共享內(nèi)存,從共享內(nèi)存中讀出數(shù)據(jù)到第二消息隊(duì)列,多個(gè)線程從第二消息隊(duì)列讀取數(shù)據(jù)。
[0355]在具體應(yīng)用中,消息隊(duì)列是可以在消息的傳輸過程中保存消息的容器,在多個(gè)不同的應(yīng)用之間實(shí)現(xiàn)相互通信的一種異步傳輸模式,將數(shù)據(jù)寫入消息隊(duì)列是通過進(jìn)隊(duì)push的操作,多線程進(jìn)隊(duì)push的操作是指同時(shí)執(zhí)行多個(gè)線程進(jìn)隊(duì)push的操作,可以采用原子操作的方式,所謂原子操作就是指不會(huì)被線程調(diào)度機(jī)制打斷的操作;這種操作一旦開始,就一直運(yùn)行到結(jié)束,中間不會(huì)切換到另一個(gè)線程,可以保證多線程進(jìn)隊(duì)push的操作不碰撞,從而將數(shù)據(jù)寫入第一消息隊(duì)列;從消息隊(duì)列中讀取數(shù)據(jù)是通過出隊(duì)pop的操作,單線程出隊(duì)pop的操作是指在執(zhí)行多個(gè)線程進(jìn)隊(duì)push的操作的同時(shí)執(zhí)行單個(gè)線程出隊(duì)pop操作。
[0356]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述步驟101具體可以包括如下子步驟:
[0357]子步驟S11,判斷所述消息隊(duì)列是否已滿;
[0358]在實(shí)際應(yīng)用中,當(dāng)消息隊(duì)列為已滿時(shí),將禁止在消息隊(duì)列中寫入數(shù)據(jù);當(dāng)消息隊(duì)列未滿時(shí),將可以在消息隊(duì)列中寫入數(shù)據(jù)。
[0359]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述子步驟Sll具體可以包括如下子步驟:
[0360]子步驟A101,讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值;
[0361]子步驟A102,遞減所述CanWriteCount的值;
[0362]子步驟A103,若獲得遞減后的CanWriteCount的值為0,則判定所述消息隊(duì)列為已滿,否則,判定所述消息隊(duì)列為未滿。
[0363]在具體應(yīng)用中,多線程進(jìn)隊(duì)push操作時(shí),每一個(gè)線程分別讀取對應(yīng)的可寫計(jì)數(shù)參數(shù)CanWriteCount的值,采用原子操作遞減CanWriteCount的值,若獲得遞減后的CanffriteCount的值為0,則判定所述消息隊(duì)列為已滿,否則,判定所述消息隊(duì)列為未滿。若所述消息隊(duì)列已滿,則禁止執(zhí)行進(jìn)隊(duì)push的操作。
[0364]通過判斷消息隊(duì)列已滿時(shí),禁止執(zhí)行進(jìn)隊(duì)push的操作,保證了寫入數(shù)據(jù)時(shí)的安全性與準(zhǔn)確性,從而保證多線程訪問成功,解決了線程間通信時(shí)阻塞的問題,從而提高服務(wù)器
吞吐量。[0365]當(dāng)然,上述判斷消息隊(duì)列是否為已滿的處理方法只是作為示例,在實(shí)施本發(fā)明實(shí)施例時(shí),可以根據(jù)實(shí)際情況設(shè)置其他判斷消息隊(duì)列是否為已滿的處理方法,本發(fā)明實(shí)施例對此不加以限制。另外,除了上述判斷消息隊(duì)列是否為已滿的處理方法外,本領(lǐng)域技術(shù)人員還可以根據(jù)實(shí)際需要采用其它判斷消息隊(duì)列是否為已滿的處理方法,本發(fā)明實(shí)施例對此也不加以限制。
[0366]子步驟S12,若否,則分別計(jì)算n個(gè)線程進(jìn)隊(duì)push的偏移量;所述n為大于或等于I的正整數(shù);
[0367]在實(shí)際應(yīng)用中,一個(gè)雙核心的CPU可以擁有4個(gè)線程,也就是說,線程的數(shù)量是CPU核數(shù)的2倍,服務(wù)器通常是8核CPU,具有16個(gè)線程。n的取值取決于任務(wù)數(shù)量,一個(gè)任務(wù)分配一個(gè)線程,偏移量是指存儲(chǔ)單元的實(shí)際地址與其所在段的段地址之間的距離,n個(gè)線程進(jìn)隊(duì)push操作時(shí),每個(gè)線程都是采用原子操作遞加的方式,計(jì)算出來n個(gè)線程進(jìn)隊(duì)push的偏移量各不相同。
[0368]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述子步驟S12具體可以包括如下子步驟:
[0369]子步驟A201,讀取進(jìn)隊(duì)push的偏移量Pushpos的值;
[0370]子步驟A202,針對所述n個(gè)線程迭代增加所述Pushpos的值,分別獲得所述n個(gè)線程進(jìn)隊(duì)push的偏移量。
[0371]在具體實(shí)現(xiàn)中,一個(gè)線程讀取進(jìn)隊(duì)push的偏移量Pushpos的值,采用當(dāng)前偏移量Pushpos的值執(zhí)行迭代增加操作,獲得該線程進(jìn)隊(duì)push的偏移量,下一個(gè)線程讀取迭代增加操作后的進(jìn)隊(duì)push的偏移量Pushpos的值,執(zhí)行迭代增加操作,獲得此線程進(jìn)隊(duì)push的偏移量,按上述方法依次針對所述n個(gè)線程迭代增加所述Pushpos的值,分別獲得所述n個(gè)線程進(jìn)隊(duì)push的偏移量。
[0372]當(dāng)然,上述計(jì)算n個(gè)線程進(jìn)隊(duì)push的偏移量的處理方法只是作為示例,在實(shí)施本發(fā)明實(shí)施例時(shí),可以根據(jù)實(shí)際情況設(shè)置其他計(jì)算n個(gè)線程進(jìn)隊(duì)push的偏移量的處理方法,本發(fā)明實(shí)施例對此不加以限制。另外,除了上述計(jì)算n個(gè)線程進(jìn)隊(duì)push的偏移量的處理方法外,本領(lǐng)域技術(shù)人員還可以根據(jù)實(shí)際需要采用其它計(jì)算n個(gè)線程進(jìn)隊(duì)push的偏移量的處理方法,本發(fā)明實(shí)施例對此也不加以限制。
[0373]子步驟S13,依據(jù)所述n個(gè)線程進(jìn)隊(duì)push的偏移量,分別計(jì)算所述n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置Pos ;
[0374]在具體實(shí)現(xiàn)中,為了保證寫入數(shù)據(jù)不超出消息隊(duì)列的范圍,可以分別計(jì)算所述n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置。
[0375]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述子步驟S13具體可以包括如下子步驟:
[0376]子步驟A301,讀取所述消息隊(duì)列大小參數(shù)Size的值;
[0377]子步驟A302,采用所述Size的值對所述Pushpos的值取模,獲得對應(yīng)的n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置Pos。
[0378]在實(shí)際應(yīng)用中,Pos=Pushpos%Size,n個(gè)線程進(jìn)隊(duì)push的偏移量各不相同,因此,n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置Pos也各不相同。這個(gè)時(shí)候?qū)嶋H位置Pos只有當(dāng)前線程獨(dú)自占有。
[0379]當(dāng)然,上述計(jì)算n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置Pos的處理方法只是作為示例,在實(shí)施本發(fā)明實(shí)施例時(shí),可以根據(jù)實(shí)際情況設(shè)置其他計(jì)算n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置Pos的處理方法,本發(fā)明實(shí)施例對此不加以限制。另外,除了上述計(jì)算n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置Pos的處理方法外,本領(lǐng)域技術(shù)人員還可以根據(jù)實(shí)際需要采用其它計(jì)算n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置Pos的處理方法,本發(fā)明實(shí)施例對此也不加以限制。
[0380]子步驟S14,所述n個(gè)線程分別在其進(jìn)隊(duì)push的實(shí)際位置Pos執(zhí)行進(jìn)隊(duì)push操作;
[0381]在具體應(yīng)用中,計(jì)算出了 n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置Pos,就可以在其進(jìn)隊(duì)push的實(shí)際位置Pos執(zhí)行進(jìn)隊(duì)push操作。
[0382]子步驟S15,執(zhí)行單線程出隊(duì)pop的操作;
[0383]在具體實(shí)現(xiàn)中,單線程出隊(duì)pop的操作可以有序地將數(shù)據(jù)讀取出來。
[0384]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述子步驟S15具體可以包括如下子步驟:
[0385]子步驟A401,單個(gè)線程依次在所述消息隊(duì)列中執(zhí)行出隊(duì)pop操作。
[0386]在實(shí)際應(yīng)用中,出隊(duì)pop操作與進(jìn)隊(duì)push操作可以同時(shí)進(jìn)行,單個(gè)線程有序的讀取消息隊(duì)列中的數(shù)據(jù)。
[0387]通過采用消息隊(duì)列執(zhí)行多線程進(jìn)隊(duì)push以及單線程出隊(duì)pop的操作,利用原子操作計(jì)算多線程進(jìn)隊(duì)push的偏移量,避免了多線程進(jìn)隊(duì)push對應(yīng)的偏移量互相重復(fù),從而計(jì)算出多線程進(jìn)隊(duì)push不同的實(shí)際位置,保證了多線程訪問操作不碰撞,利用單個(gè)線程依次有序執(zhí)行出隊(duì)pop操作,解決了線程間通信時(shí)阻塞的問題,減少了資源消耗,充分利用了系統(tǒng)資源,提高了處理速度,從而提高了服務(wù)器吞吐量。
[0388]為便于本領(lǐng)域技術(shù)人員更好地理解本發(fā)明,以下通過一個(gè)具體示例簡單說明多線程進(jìn)隊(duì)push的方法。
[0389]參照圖3,示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種多線程進(jìn)隊(duì)push的示意圖。如圖3所示,ThreadU Thread2、Thread3、Thread4分別是線程1、線程2、線程3、線程4,圖示中消息隊(duì)列的各個(gè)方格表示實(shí)際位置。
[0390]在具體應(yīng)用中,線程1、線程2、線程3、線程4分別執(zhí)行進(jìn)隊(duì)push操作,線程I讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值,采用原子操作遞減CanWriteCount的值,獲得遞減后的CanWriteCount的值不為0,然后,讀取進(jìn)隊(duì)push的偏移量Pushpos的值,采用偏移量Pushpos的值執(zhí)行迭代增加操作,獲得該線程進(jìn)隊(duì)push的偏移量,之后,讀取消息隊(duì)列大小參數(shù)Size的值,采用Size的值對Pushpos的值取模,得到實(shí)際位置,如圖3所示的消息隊(duì)列中第5個(gè)方格,此時(shí),第5個(gè)方格只有線程I獨(dú)自占有,線程I在第5個(gè)方格執(zhí)行進(jìn)隊(duì)push操作。線程3讀取線程I遞減后的可寫計(jì)數(shù)參數(shù)CanWriteCount的值,在其基礎(chǔ)之上執(zhí)行遞減CanWriteCount的值的操作,獲得遞減后的CanWriteCount的值也不為0,然后,讀取線程I進(jìn)隊(duì)push的偏移量,在其基礎(chǔ)之上執(zhí)行迭代增加Pushpos的值的操作,采用Size的值對Pushpos的值取模,得到實(shí)際位置,如圖3所示的消息隊(duì)列中第6個(gè)方格,此時(shí),第6個(gè)方格只有線程3獨(dú)自占有,線程3在第6個(gè)方格執(zhí)行進(jìn)隊(duì)push操作。線程4、線程2也按上述方法分別在如圖3所示的消息隊(duì)列中第7個(gè)方格、第8個(gè)方格執(zhí)行進(jìn)隊(duì)push操作。
[0391]步驟102,將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存;
[0392]需要說明的是,在本發(fā)明實(shí)施例中,共享內(nèi)存指基于環(huán)形緩沖區(qū)的共享內(nèi)存,顧名思義這個(gè)緩沖區(qū)是環(huán)形的,所謂環(huán)形,就是用一個(gè)指針去訪問該緩沖區(qū)的最后一個(gè)內(nèi)存位置的后一位置時(shí)回到環(huán)形緩沖區(qū)的起點(diǎn)。環(huán)形緩沖區(qū)通常有一個(gè)讀指針和一個(gè)寫指針,讀指針指向環(huán)形緩沖區(qū)中可讀的緩沖區(qū),寫指針指向環(huán)形緩沖區(qū)中可寫的緩沖區(qū)。通過移動(dòng)讀指針和寫指針就可以實(shí)現(xiàn)緩沖區(qū)的數(shù)據(jù)讀取和寫入。在通常情況下,環(huán)形緩沖區(qū)的讀操作僅僅會(huì)影響讀指針,而寫操作僅僅會(huì)影響寫指針。
[0393]在實(shí)際應(yīng)用中,將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存中可以不加鎖地實(shí)現(xiàn),共享內(nèi)存可以支持同時(shí)執(zhí)行寫入操作和讀取操作。
[0394]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述步驟102具體可以包括如下子步驟:
[0395]子步驟S201,獲得所述單線程出隊(duì)pop的數(shù)據(jù)及其長度;
[0396]需要說明的是,在本發(fā)明實(shí)施例中,所述數(shù)據(jù)即為數(shù)據(jù),需要將數(shù)據(jù)以及數(shù)據(jù)長度與入共孚內(nèi)存。
[0397]子步驟S202,檢查所述數(shù)據(jù)的長度是否超出共享內(nèi)存的長度界限;
[0398]在具體實(shí)現(xiàn)中,共享內(nèi)存的長度是有限的,長度超過共享內(nèi)存最大長度的數(shù)據(jù)是不合法的,將不能被寫入共享內(nèi)存中。
[0399]子步驟S203,若否,則獲取所述共享內(nèi)存的讀偏移指針pRead和寫偏移指針pWrite ;
[0400]在實(shí)際應(yīng)用中,當(dāng)數(shù)據(jù)的長度未超出共享內(nèi)存的長度界限,判定數(shù)據(jù)合法,可以寫入共享內(nèi)存中,獲取所述共享內(nèi)存的讀偏移指針PRead和寫偏移指針pWrite。更具體地,當(dāng)數(shù)據(jù)的長度超共享內(nèi)存的最大長度時(shí),判定數(shù)據(jù)不合法,禁止寫入。
[0401]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述子步驟S203具體可以包括如下子步驟:
[0402]子步驟BlOl,獲得所述共享內(nèi)存的映射文件,所述映射文件包括文件頭;
[0403]子步驟B102,從所述文件頭中讀取寫偏移指針pWrite ;
[0404]子步驟B103,從所述文件頭中讀取讀偏移指針pRead并快照到臨時(shí)變量中。
[0405]在具體應(yīng)用中,采用內(nèi)存映射的方式,打開控制內(nèi)存文件。內(nèi)存文件數(shù)據(jù)結(jié)構(gòu)可以包括:文件頭、文件size、Read指針、Write指針、文件頭結(jié)束、實(shí)際數(shù)據(jù),如圖4所示,示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種內(nèi)存文件數(shù)據(jù)結(jié)構(gòu)的示意圖。讀取內(nèi)存文件數(shù)據(jù)結(jié)構(gòu)的Read指針和Write指針即可以獲取所述共享內(nèi)存的讀偏移指針pRead和寫偏移指針pWrite。并將讀偏移指針pRead快照到臨時(shí)變量中,記錄當(dāng)前讀偏移指針pRead的位置。
[0406]上述獲取讀偏移指針pRead和寫偏移指針pWrite的讀寫方法只是作為不例,在實(shí)施本發(fā)明實(shí)施例時(shí),可以根據(jù)實(shí)際情況設(shè)置其他獲取讀偏移指針PRead和寫偏移指針Pffrite的讀寫方法,本發(fā)明實(shí)施例對此不加以限制。另外,除了上述獲取讀偏移指針pRead和寫偏移指針PWrite的讀寫方法外,本領(lǐng)域技術(shù)人員還可以根據(jù)實(shí)際需要采用其它獲取讀偏移指針PRead和寫偏移指針pWrite的讀寫方法,本發(fā)明實(shí)施例對此也不加以限制。
[0407]本發(fā)明通過獲得所述共享內(nèi)存的映射文件,所述映射文件包括文件頭,從所述文件頭中讀取讀偏移指針PRead并快照到臨時(shí)變量中,記錄了當(dāng)前讀偏移指針pRead的位置,從而保證了在執(zhí)行當(dāng)前寫操作的內(nèi)存不會(huì)隨讀偏移指針PRead的變化而被修改,即讀操作和寫操作可以同時(shí)進(jìn)行,并且,保證了寫偏移指針PWrite不會(huì)與讀偏移指針pRead產(chǎn)生沖突,因此能夠充分利用系統(tǒng)資源,解決進(jìn)程間通信時(shí)阻塞的問題,減少資源消耗,從而提高服務(wù)器吞吐量。
[0408]子步驟S204,依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置,并判斷所述數(shù)據(jù)是否可寫;[0409]在具體實(shí)現(xiàn)中,數(shù)據(jù)在共享內(nèi)存中的寫入位置可以由寫偏移指針pWrite決定。數(shù)據(jù)的長度在由讀偏移指針PRead和寫偏移指針pWrite組成的可寫數(shù)據(jù)的長度范圍之內(nèi)時(shí),數(shù)據(jù)可寫;數(shù)據(jù)的長度在由讀偏移指針PRead和寫偏移指針pWrite組成的可寫數(shù)據(jù)的長度范圍之外時(shí),數(shù)據(jù)不可寫。
[0410]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述子步驟S204具體可以包括如下子步驟:
[0411]子步驟B201,依據(jù)所述寫偏移指針pWrite確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置;
[0412]子步驟B202,當(dāng)所述讀偏移指針pRead和寫偏移指針pWrite處于同一位置時(shí),判定所述數(shù)據(jù)可寫。
[0413]在具體應(yīng)用中,數(shù)據(jù)從寫偏移指針pWrite位置開始執(zhí)行寫操作,數(shù)據(jù)在共享內(nèi)存中的寫入位置由寫偏移指針PWrite確定。由于數(shù)據(jù)是合法的,因此,把環(huán)狀的數(shù)據(jù)變成文件順序的數(shù)據(jù),通過邊緣控制模擬環(huán)形運(yùn)動(dòng),則可以用pRead==pWrite表示讀偏移指針pRead和寫偏移指針pWrite處于同一位置時(shí),即共享內(nèi)存為空,數(shù)據(jù)的長度未超出共享內(nèi)存的長度界限,判定所述數(shù)據(jù)可寫。
[0414]在本發(fā)明的另一種優(yōu)選實(shí)施例中,所述子步驟S204具體可以包括如下子步驟:
[0415]子步驟B301,依據(jù)所述寫偏移指針pWrite確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置;
[0416]子步驟B302,當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite后面的位置時(shí),設(shè)置可寫數(shù)據(jù)的長度小于或等于allsize-pRead+pWrite-head,其中allsize為共享內(nèi)存的長度,所述head為文件頭的長度;
[0417]子步驟B303,判斷所述數(shù)據(jù)的長度是否小于或等于所述可寫數(shù)據(jù)的長度;
[0418]子步驟B304,若是,則判定所述數(shù)據(jù)可寫;
[0419]子步驟B305,若否,則判定所述數(shù)據(jù)不可寫。
[0420]在實(shí)際應(yīng)用中,把環(huán)狀的數(shù)據(jù)變成文件順序的數(shù)據(jù),通過邊緣控制模擬環(huán)形運(yùn)動(dòng),則可以用pRead〈pWrite表示所述讀偏移指針pRead處于所述寫偏移指針pWrite后面的位置,數(shù)據(jù)在共享內(nèi)存中的寫入位置可以為從寫偏移指針PWrite到環(huán)形緩沖區(qū)終點(diǎn)的位置,還可以有另一部分為從文件頭結(jié)束的位置到讀偏移指針pRead,因此,設(shè)置可寫數(shù)據(jù)的長度小于或等于allsize-pRead+pWrite-head,分別讀取內(nèi)存文件數(shù)據(jù)結(jié)構(gòu)的文件頭和文件size可以獲得所述head和所述allsize。當(dāng)所述數(shù)據(jù)的長度小于或等于所述可寫數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)可寫;當(dāng)所述數(shù)據(jù)的長度大于所述可寫數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)不可寫。
[0421]在本發(fā)明的另一種優(yōu)選實(shí)施例中,所述子步驟S204具體可以包括如下子步驟:
[0422]子步驟B401,依據(jù)所述寫偏移指針pWrite確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置;
[0423]子步驟B402,當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),設(shè)置可寫數(shù)據(jù)的長度小于或等于pRead-pWrite ;
[0424]子步驟B403,判斷所述數(shù)據(jù)的長度是否小于或等于所述可寫數(shù)據(jù)的長度;
[0425]子步驟B404,若是,則判定所述數(shù)據(jù)可寫;
[0426]子步驟B405,若否,則判定所述數(shù)據(jù)不可寫。[0427]在具體應(yīng)用中,把環(huán)狀的數(shù)據(jù)變成文件順序的數(shù)據(jù),通過邊緣控制模擬環(huán)形運(yùn)動(dòng),則可以用pRead>pWrite表示所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置,可寫數(shù)據(jù)的長度小于或等于PRead-pWrite,當(dāng)所述數(shù)據(jù)的長度小于或等于所述可寫數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)可讀;當(dāng)所述數(shù)據(jù)的長度大于所述可寫數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)不可寫。
[0428]子步驟S205,若是,則在所述寫入位置寫入所述數(shù)據(jù)。
[0429]在實(shí)際應(yīng)用中,每一個(gè)數(shù)據(jù)所在共享內(nèi)存的位置不一定都相同,需要根據(jù)數(shù)據(jù)所在共享內(nèi)存不同的位置開始寫入數(shù)據(jù)。
[0430]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述子步驟S205具體可以包括如下子步驟:
[0431]子步驟B501,當(dāng)所述讀偏移指針pRead和寫偏移指針pWrite處于同一位置時(shí),或,當(dāng)所述讀偏移指針PRead處于所述寫偏移指針pWrite后面的位置時(shí),則從當(dāng)前寫偏移指針Pffrite位置開始寫入所述數(shù)據(jù);
[0432]子步驟B502,當(dāng)寫入到所述共享內(nèi)存尾部的位置時(shí),判斷所述數(shù)據(jù)是否已全部寫A ;
[0433]子步驟B503,若否,則從所述共享內(nèi)存中文件頭結(jié)束的位置開始繼續(xù)寫入所述數(shù)據(jù),直至在所述讀偏移指針PRead位置之前寫入全部的數(shù)據(jù)。
[0434]在具體實(shí)現(xiàn)中,當(dāng)所述讀偏移指針pRead和寫偏移指針pWrite處于同一位置時(shí),或,當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite后面的位置時(shí),即pRead==pWrite或pRead〈pWrite時(shí),數(shù)據(jù)所在共享內(nèi)存中的寫入位置可以為從寫偏移指針pWrite到環(huán)形緩沖區(qū)終點(diǎn)的位置,還可以有另一部分為從文件頭結(jié)束的位置到讀偏移指針pRead,因此,數(shù)據(jù)所在共享內(nèi)存的位置為allsize-pRead+pWrite-head的范圍內(nèi)。從當(dāng)前寫偏移指針pWrite位置開始寫入所述數(shù)據(jù),當(dāng)寫入到所述共享內(nèi)存尾部的位置時(shí),若數(shù)據(jù)已全部寫入,則完成當(dāng)前寫操作;若數(shù)據(jù)未全部寫入,從所述共享內(nèi)存中文件頭結(jié)束的位置開始繼續(xù)寫入所述數(shù)據(jù),可以在所述讀偏移指針PRead位置之前寫入全部的數(shù)據(jù)。更具體而言,采用內(nèi)存拷貝memcpy的方式寫入所述數(shù)據(jù)。
[0435]在本發(fā)明的另一種優(yōu)選實(shí)施例中,所述子步驟S205具體可以包括如下子步驟:
[0436]子步驟B601,當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),則從當(dāng)前寫偏移指針PWrite位置開始寫入所述數(shù)據(jù);
[0437]子步驟B602,在所述讀偏移指針pRead位置之前寫入全部的數(shù)據(jù)。
[0438]在具體實(shí)現(xiàn)中,當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),即pRead>pWrite,數(shù)據(jù)所在共享內(nèi)存的位置即為pRead-pWrite的范圍內(nèi),從當(dāng)前寫偏移指針PWrite位置開始寫入所述數(shù)據(jù),可以在不超過所述讀偏移指針pRead位置讀出全部的數(shù)據(jù)。更具體而言,采用內(nèi)存拷貝memcpy的方式寫入所述數(shù)據(jù)。
[0439]本發(fā)明通過采用內(nèi)存拷貝memcpy的方式寫入所述數(shù)據(jù)的方式,能夠快速地將數(shù)據(jù)與入共孚內(nèi)存中,從而提聞處理速度,提聞服務(wù)器吞吐量。
[0440]本發(fā)明通過獲得數(shù)據(jù)及其長度,在寫入數(shù)據(jù)的長度不超出共享內(nèi)存的長度界限的情況下獲取所述共享內(nèi)存的讀偏移指針PRead和寫偏移指針pWrite,可以不加鎖的控制寫入數(shù)據(jù),避免了加鎖造成的阻塞的問題,從而減少資源消耗,充分利用系統(tǒng)資源,提高處理速度,提高服務(wù)器吞吐量。[0441]當(dāng)然,上述寫入所述數(shù)據(jù)的處理方法只是作為示例,在實(shí)施本發(fā)明實(shí)施例時(shí),可以根據(jù)實(shí)際情況設(shè)置其他寫入所述數(shù)據(jù)的處理方法,本發(fā)明實(shí)施例對此不加以限制。另外,除了上述寫入所述數(shù)據(jù)的處理方法外,本領(lǐng)域技術(shù)人員還可以根據(jù)實(shí)際需要采用其它寫入所述數(shù)據(jù)的處理方法,本發(fā)明實(shí)施例對此也不加以限制。
[0442]參照圖5,示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種基于消息隊(duì)列的共享內(nèi)存讀取方法實(shí)施例的步驟流程圖,所述消息隊(duì)列包括第二消息隊(duì)列,具體可以包括如下步驟:
[0443]步驟201,從共享內(nèi)存中讀取數(shù)據(jù);
[0444]在實(shí)際應(yīng)用中,從共享內(nèi)存中讀取數(shù)據(jù)可以不加鎖地實(shí)現(xiàn),并且,在共享內(nèi)存中執(zhí)行讀取操作的同時(shí)可以執(zhí)行寫入操作。
[0445]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述步驟201具體可以包括如下子步驟:
[0446]子步驟S301,定位數(shù)據(jù)所在共享內(nèi)存的位置;
[0447]在實(shí)際應(yīng)用中,每個(gè)數(shù)據(jù)在內(nèi)存上都有其映射地址,定位數(shù)據(jù)的映射地址可以定位出數(shù)據(jù)所在共享內(nèi)存的位置。
[0448]子步驟S302,獲得所述數(shù)據(jù)的長度;
[0449]需要說明的是,在本發(fā)明實(shí)施例中,每一條數(shù)據(jù)的協(xié)議可以包括協(xié)議頭、協(xié)議版本、數(shù)據(jù)的長度(數(shù)據(jù)size)、循環(huán)冗余校驗(yàn)碼(Cyclic Redundancy Check, CRC)、包名稱(包id)、其他擴(kuò)展以及實(shí)際寫入的數(shù)據(jù),具體可以參考如圖6所示的根據(jù)本發(fā)明一個(gè)實(shí)施例的一種數(shù)據(jù)的協(xié)議的示意圖。通過讀取圖6中的數(shù)據(jù)size即可以獲得數(shù)據(jù)的長度。
[0450]當(dāng)然,上述獲得所述數(shù)據(jù)的長度的處理方法只是作為示例,在實(shí)施本發(fā)明實(shí)施例時(shí),可以根據(jù)實(shí)際情況設(shè)置其他獲得所述數(shù)據(jù)的長度的處理方法,本發(fā)明實(shí)施例對此不加以限制。另外,除了上述獲得所述數(shù)據(jù)的長度的處理方法外,本領(lǐng)域技術(shù)人員還可以根據(jù)實(shí)際需要采用其它獲得所述數(shù)據(jù)的長度的處理方法,本發(fā)明實(shí)施例對此也不加以限制。
[0451]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述步驟201還可以包括如下步驟:
[0452]若所述數(shù)據(jù)的長度超出共享內(nèi)存的長度界限,則禁止寫入。
[0453]在實(shí)際應(yīng)用中,當(dāng)數(shù)據(jù)的長度超共享內(nèi)存的最大長度時(shí),判定數(shù)據(jù)不合法,禁止寫入。
[0454]子步驟S303,獲取所述共享內(nèi)存的讀偏移指針pRead和寫偏移指針pWrite ;
[0455]需要說明的是,在本發(fā)明實(shí)施例中,可以把共享內(nèi)存的讀偏移指針pRead和寫偏移指針PWrite想象成是兩個(gè)人在體育場跑道上追逐,讀偏移指針pRead追寫偏移指針pWrite,則讀偏移指針pRead和寫偏移指針pWrite的使用可以包括以下原則:
[0456]1、只在pWrite 追上pRead 時(shí)候,pRead和 pWrite 重疊。不能是pRead追上pWrite。
[0457]2、pffrite不能從pRead后面追過去,追過去就覆蓋了之前未讀取的數(shù)據(jù),此時(shí)數(shù)據(jù)用內(nèi)存隊(duì)列等待。
[0458]3、pRead不能追上pWrite,用一個(gè)字節(jié)隔離。pRead永遠(yuǎn)不會(huì)從后面追上pWrite。
[0459]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述子步驟S303具體可以包括如下子步驟:
[0460]子步驟C101,獲得所述共享內(nèi)存的映射文件,所述映射文件包括文件頭;
[0461]子步驟C102,從所述文件頭中讀取讀偏移指針pRead ;
[0462]子步驟C103,從所述文件頭中讀取寫偏移指針pWrite并快照到臨時(shí)變量中。
[0463]在具體應(yīng)用中,采用內(nèi)存映射的方式,打開控制內(nèi)存文件。內(nèi)存文件數(shù)據(jù)結(jié)構(gòu)可以包括:文件頭、文件size、Read指針、Write指針、文件頭結(jié)束、實(shí)際數(shù)據(jù),具體可以參考如圖4所示的本發(fā)明一種內(nèi)存文件數(shù)據(jù)結(jié)構(gòu)的示意圖。通過讀取圖4中的Read指針和Write指針即可以獲取所述共享內(nèi)存的讀偏移指針PRead和寫偏移指針pWrite。并將寫偏移指針pWrite快照到臨時(shí)變量中,記錄當(dāng)前寫偏移指針pWrite的位置。
[0464]上述獲取讀偏移指針pRead和寫偏移指針pWrite的處理方法只是作為不例,在實(shí)施本發(fā)明實(shí)施例時(shí),可以根據(jù)實(shí)際情況設(shè)置其他獲取讀偏移指針PRead和寫偏移指針Pffrite的處理方法,本發(fā)明實(shí)施例對此不加以限制。另外,除了上述獲取讀偏移指針pRead和寫偏移指針PWrite的處理方法外,本領(lǐng)域技術(shù)人員還可以根據(jù)實(shí)際需要采用其它獲取讀偏移指針PRead和寫偏移指針pWrite的處理方法,本發(fā)明實(shí)施例對此也不加以限制。
[0465]本發(fā)明通過獲得所述共享內(nèi)存的映射文件,所述映射文件包括文件頭,從所述文件頭中讀取寫偏移指針pWrite并快照到臨時(shí)變量中,記錄了當(dāng)前寫偏移指針pWrite的位置,從而保證了在執(zhí)行當(dāng)前讀操作的內(nèi)存不會(huì)隨寫偏移指針PWrite的變化而被修改,即讀操作和寫操作可以同時(shí)進(jìn)行,并且,保證了讀偏移指針PRead不會(huì)與寫偏移指針pWrite產(chǎn)生沖突,因此能夠充分利用系統(tǒng)資源,解決進(jìn)程間通信時(shí)阻塞的問題,減少資源消耗,從而提高服務(wù)器吞吐量。
[0466]子步驟S304,依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,判斷所述數(shù)據(jù)是否可讀;
[0467]在具體實(shí)現(xiàn)中,數(shù)據(jù)的長度在由讀偏移指針pRead和寫偏移指針pWrite組成的可讀數(shù)據(jù)的長度范圍之內(nèi)時(shí),數(shù)據(jù)可讀;數(shù)據(jù)的長度在由讀偏移指針PRead和寫偏移指針pWrite組成的可讀數(shù)據(jù)的長度范圍之外時(shí),數(shù)據(jù)不可讀。
[0468]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述子步驟S304具體可以包括如下子步驟:
[0469]子步驟C201,當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite后面的位置時(shí),設(shè)置可讀數(shù)據(jù)的長度小于或等于pWrite-pRead ;
[0470]子步驟C202,判斷所述數(shù)據(jù)的長度是否小于或等于所述可讀數(shù)據(jù)的長度;
[0471]子步驟C203,若是,則判定所述數(shù)據(jù)可讀;
[0472]子步驟C204,若否,則判定所述數(shù)據(jù)不可讀。
[0473]需要說明的是,在本發(fā)明實(shí)施例中,由于共享內(nèi)存具有環(huán)形的特性,即一個(gè)指針去訪問該緩沖區(qū)的最后一個(gè)內(nèi)存位置的后一位置時(shí)回到環(huán)形緩沖區(qū)的起點(diǎn),可以想像共享內(nèi)存為環(huán)形緩沖區(qū)的起點(diǎn)和終點(diǎn)首尾相接的環(huán),以環(huán)形緩沖區(qū)的起點(diǎn)作為參考,假設(shè)寫偏移指針pWrite和讀偏移指針pRead按照順時(shí)針方向移動(dòng),當(dāng)寫偏移指針pWrite相對于環(huán)形緩沖區(qū)的起點(diǎn)的偏移量大于讀偏移指針PRead相對于環(huán)形緩沖區(qū)的起點(diǎn)的偏移量時(shí),則讀偏移指針pRead處于所述寫偏移指針pWrite后面的位置;當(dāng)寫偏移指針pWrite相對于環(huán)形緩沖區(qū)的起點(diǎn)的偏移量小于讀偏移指針PRead相對于環(huán)形緩沖區(qū)的起點(diǎn)的偏移量時(shí),則讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置。
[0474]在具體應(yīng)用中,把環(huán)狀的數(shù)據(jù)變成文件順序的數(shù)據(jù),通過邊緣控制模擬環(huán)形運(yùn)動(dòng),則可以用pRead〈pWrite表示所述讀偏移指針pRead處于所述寫偏移指針pWrite后面的位置,可讀數(shù)據(jù)的長度小于或等于PWrite-pRead,當(dāng)所述數(shù)據(jù)的長度小于或等于所述可讀數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)可讀;當(dāng)所述數(shù)據(jù)的長度大于所述可讀數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)不可讀。[0475]在本發(fā)明的另一種優(yōu)選實(shí)施例中,所述子步驟S304具體可以包括如下子步驟:
[0476]子步驟C301,當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),設(shè)置可讀數(shù)據(jù)的長度小于或等于allsize-pRead+pWrite-head,其中,所述allsize為共享內(nèi)存的長度,所述head為文件頭的長度;
[0477]子步驟C302,判斷所述數(shù)據(jù)的長度是否小于或等于所述可讀數(shù)據(jù)的長度;
[0478]子步驟C303,若是,則判斷所述數(shù)據(jù)可讀;
[0479]子步驟C304,若否,則判定所述數(shù)據(jù)不可讀。
[0480]在具體實(shí)現(xiàn)中,把環(huán)狀的數(shù)據(jù)變成文件順序的數(shù)據(jù),通過邊緣控制模擬環(huán)形運(yùn)動(dòng),則可以用pRead>pWrite表示所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置,數(shù)據(jù)所在共享內(nèi)存的位置可以為從讀偏移指針PRead到環(huán)形緩沖區(qū)終點(diǎn)的位置,還可以有另一部分為從文件頭結(jié)束的位置到寫偏移指針PWrite,因此,設(shè)置可讀數(shù)據(jù)的長度小于或等于allsize-pRead+pWrite-head,分別讀取內(nèi)存文件數(shù)據(jù)結(jié)構(gòu)的文件頭和文件size可以獲得所述head和所述allsize。當(dāng)所述數(shù)據(jù)的長度小于或等于所述可讀數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)可讀;當(dāng)所述數(shù)據(jù)的長度大于所述可讀數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)不可讀。
[0481]在本發(fā)明的另一種優(yōu)選實(shí)施例中,所述子步驟S304具體可以包括如下子步驟:
[0482]子步驟C401,當(dāng)所述讀偏移指針pRead和寫偏移指針pWrite處于同一位置時(shí),貝Ij判定所述數(shù)據(jù)不可讀。
[0483]在具體應(yīng)用中,把環(huán)狀的數(shù)據(jù)變成文件順序的數(shù)據(jù),通過邊緣控制模擬環(huán)形運(yùn)動(dòng),則可以用pRead==pWrite表示所述讀偏移指針pRead和寫偏移指針pWrite處于同一位置,判定此時(shí)數(shù)據(jù)不可讀,返回?cái)?shù)據(jù)為空。
[0484]當(dāng)然,上述判斷所述數(shù)據(jù)是否可讀的處理方法只是作為示例,在實(shí)施本發(fā)明實(shí)施例時(shí),可以根據(jù)實(shí)際情況設(shè)置其他判斷所述數(shù)據(jù)是否可讀的處理方法,本發(fā)明實(shí)施例對此不加以限制。另外,除了上述判斷所述數(shù)據(jù)是否可讀的處理方法外,本領(lǐng)域技術(shù)人員還可以根據(jù)實(shí)際需要采用其它判斷所述數(shù)據(jù)是否可讀的處理方法,本發(fā)明實(shí)施例對此也不加以限制。
[0485]子步驟S305,若是,則從所述數(shù)據(jù)所在共享內(nèi)存的位置,讀出所述數(shù)據(jù)。
[0486]在實(shí)際應(yīng)用中,每一個(gè)數(shù)據(jù)所在共享內(nèi)存的位置不一定都相同,需要根據(jù)數(shù)據(jù)所在共享內(nèi)存不同的位置開始讀出數(shù)據(jù)。
[0487]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述子步驟S305具體可以包括如下子步驟:
[0488]子步驟C501,當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite后面的位置時(shí),則從當(dāng)前讀偏移指針PRead位置開始讀出所述數(shù)據(jù);
[0489]子步驟C502,在不超過所述寫偏移指針pWrite位置讀出全部的數(shù)據(jù)。
[0490]在具體實(shí)現(xiàn)中,當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite后面的位置時(shí),即pRead〈pWrite,數(shù)據(jù)所在共享內(nèi)存的位置即為pWrite-pRead的范圍內(nèi),從當(dāng)前讀偏移指針pRead位置開始讀出所述數(shù)據(jù),可以在不超過所述寫偏移指針pWrite位置讀出全部的數(shù)據(jù)。更具體而言,采用內(nèi)存拷貝memcpy的方式讀出所述數(shù)據(jù)。
[0491]在本發(fā)明的另一種優(yōu)選實(shí)施例中,所述子步驟S305具體可以包括如下子步驟:
[0492]子步驟C601,當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),則從當(dāng)前讀偏移指針PRead位置開始讀出所述數(shù)據(jù);
[0493]子步驟C602,當(dāng)讀取至所述共享內(nèi)存尾部的位置時(shí),判斷所述數(shù)據(jù)是否已全部讀出;
[0494]子步驟C603,若否,則從所述共享內(nèi)存中文件頭結(jié)束的位置開始繼續(xù)讀出所述數(shù)據(jù),直至在不超過所述寫偏移指針PWrite位置讀出全部的數(shù)據(jù)。
[0495]在具體實(shí)現(xiàn)中,當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),即pRead>pWrite,數(shù)據(jù)所在共享內(nèi)存的位置可以為從讀偏移指針pRead到環(huán)形緩沖區(qū)終點(diǎn)的位置,還可以有另一部分為從文件頭結(jié)束的位置到寫偏移指針pWrite,因此,數(shù)據(jù)所在共享內(nèi)存的位置為allsize-pRead+pWrite-head的范圍內(nèi)。從當(dāng)前讀偏移指針pRead位置開始讀出所述數(shù)據(jù),當(dāng)讀取至所述共享內(nèi)存尾部的位置時(shí),若數(shù)據(jù)已全部讀出,則完成當(dāng)前讀操作;若數(shù)據(jù)未全部讀出,則從所述共享內(nèi)存中文件頭結(jié)束的位置開始繼續(xù)讀出所述數(shù)據(jù),可以在不超過所述寫偏移指針PWrite位置讀出全部的數(shù)據(jù)。更具體而言,采用內(nèi)存拷貝memcpy的方式讀出所述數(shù)據(jù)。
[0496]本發(fā)明通過采用內(nèi)存拷貝memcpy的方式讀出所述數(shù)據(jù)的方式,能夠快速地將數(shù)據(jù)從共享內(nèi)存中讀出,從而提高處理速度,提高服務(wù)器吞吐量。
[0497]本發(fā)明通過定位數(shù)據(jù)所在共享內(nèi)存的位置,獲取數(shù)據(jù)的長度,以及,共享內(nèi)存的讀偏移指針PRead和寫偏移指針pWrite,可以不加鎖的控制讀出數(shù)據(jù),避免了加鎖造成的阻塞的問題,從而減少資源消耗,充分利用系統(tǒng)資源,提高處理速度,提高服務(wù)器吞吐量。
[0498]當(dāng)然,上述讀出所述數(shù)據(jù)的處理方法只是作為示例,在實(shí)施本發(fā)明實(shí)施例時(shí),可以根據(jù)實(shí)際情況設(shè)置其他讀出所述數(shù)據(jù)的處理方法,本發(fā)明實(shí)施例對此不加以限制。另外,除了上述讀出所述數(shù)據(jù)的處理方法外,本領(lǐng)域技術(shù)人員還可以根據(jù)實(shí)際需要采用其它讀出所述數(shù)據(jù)的處理方法,本發(fā)明實(shí)施例對此也不加以限制。
[0499]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述步驟201還可以包括如下子步驟:
[0500]子步驟S306,若所述數(shù)據(jù)不可讀,則返回?cái)?shù)據(jù)為空。
[0501]在具體應(yīng)用中,若數(shù)據(jù)大于可讀數(shù)據(jù)的長度,即超過由讀偏移指針pRead和寫偏移指針PWrite組成的可讀數(shù)據(jù)的長度的范圍,則返回?cái)?shù)據(jù)為空。
[0502]步驟202,將讀出的數(shù)據(jù)通過單線程進(jìn)隊(duì)push的操作壓入所述第二消息隊(duì)列,同時(shí),采用所述第二消息隊(duì)列執(zhí)行多線程出隊(duì)pop的操作;
[0503]在實(shí)際應(yīng)用中,單線程進(jìn)隊(duì)push的操作是指采用原子操作執(zhí)行單個(gè)線程進(jìn)隊(duì)push的操作,多線程出隊(duì)pop的操作是指采用原子操作執(zhí)行多個(gè)線程出隊(duì)pop的操作,單線程進(jìn)隊(duì)push和多線程出隊(duì)pop的操作可以同時(shí)進(jìn)行。
[0504]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述步驟202具體可以包括如下子步驟:
[0505]子步驟S401,執(zhí)行單線程進(jìn)隊(duì)push的操作;
[0506]在實(shí)際應(yīng)用中,單線程進(jìn)隊(duì)push的操作可以有序地將數(shù)據(jù)寫入第二消息隊(duì)列。
[0507]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述子步驟S401具體可以包括如下子步驟:
[0508]子步驟D101,單個(gè)線程依次在所述消息隊(duì)列中執(zhí)行進(jìn)隊(duì)push操作;
[0509]在實(shí)際應(yīng)用中,出隊(duì)pop操作與進(jìn)隊(duì)push操作可以同時(shí)進(jìn)行,單個(gè)線程有序的寫入數(shù)據(jù)到消息隊(duì)列中。
[0510]子步驟S402,判斷所述消息隊(duì)列是否已空;
[0511]在具體實(shí)現(xiàn)中,當(dāng)消息隊(duì)列為已空時(shí),將禁止在消息隊(duì)列中讀取數(shù)據(jù)。[0512]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述子步驟S402具體可以包括如下子步驟:
[0513]子步驟D201,讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值;
[0514]子步驟D202,遞減所述CanReadCount的值;
[0515]子步驟D203,若獲得遞減后的CanReadCount的值為0,則判定所述消息隊(duì)列為已空,否則,判定所述消息隊(duì)列為未空。
[0516]在具體應(yīng)用中,多線程進(jìn)隊(duì)pop操作時(shí),每一個(gè)線程分別讀取對應(yīng)的可讀計(jì)數(shù)參數(shù)CanReadCount的值,采用原子操作遞減CanReadCount的值,若獲得遞減后的CanReadCount的值為0,則判定所述消息隊(duì)列為已空,否則,判定所述消息隊(duì)列為未空。若所述消息隊(duì)列已空,則禁止執(zhí)行出隊(duì)pop的操作。
[0517]通過判斷消息隊(duì)列已空時(shí),禁止執(zhí)行出隊(duì)pop的操作,保證了讀取數(shù)據(jù)時(shí)的安全性與準(zhǔn)確性,從而保證多線程訪問成功,解決了線程間通信時(shí)阻塞的問題,從而提高服務(wù)器
吞吐量。
[0518]當(dāng)然,上述判斷消息隊(duì)列是否為已空的處理方法只是作為示例,在實(shí)施本發(fā)明實(shí)施例時(shí),可以根據(jù)實(shí)際情況設(shè)置其他判斷消息隊(duì)列是否為已空的處理方法,本發(fā)明實(shí)施例對此不加以限制。另外,除了上述判斷消息隊(duì)列是否為已空的處理方法外,本領(lǐng)域技術(shù)人員還可以根據(jù)實(shí)際需要采用其它判斷消息隊(duì)列是否為已空的處理方法,本發(fā)明實(shí)施例對此也不加以限制。
[0519]子步驟S403,若否,則分別計(jì)算n個(gè)線程出隊(duì)pop的偏移量;所述n為大于或等于I的正整數(shù);
[0520]在實(shí)際應(yīng)用中,n個(gè)線程出隊(duì)pop操作時(shí),每個(gè)線程都是采用原子操作遞加的方式,計(jì)算出來n個(gè)線程出隊(duì)pop的偏移量各不相同。
[0521]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述子步驟S403具體可以包括如下子步驟:
[0522]子步驟D301,讀取出隊(duì)pop的偏移量Poppos的值;
[0523]子步驟D302,針對所述n個(gè)線程迭代增加所述Poppos的值,分別獲得所述n個(gè)線程出隊(duì)pop的偏移量。
[0524]在具體實(shí)現(xiàn)中,一個(gè)線程讀取出隊(duì)pop的偏移量Poppos的值,采用當(dāng)前偏移量Poppos的值執(zhí)行迭代增加操作,獲得該線程出隊(duì)pop的偏移量,下一個(gè)線程讀取迭代增加操作后的出隊(duì)pop的偏移量Poppos的值,執(zhí)行迭代增加操作,獲得此線程出隊(duì)pop的偏移量,按上述方法依次針對所述n個(gè)線程迭代增加所述Poppos的值,分別獲得所述n個(gè)線程出隊(duì)pop的偏移量。
[0525]當(dāng)然,上述計(jì)算n個(gè)線程出隊(duì)pop的偏移量的處理方法只是作為示例,在實(shí)施本發(fā)明實(shí)施例時(shí),可以根據(jù)實(shí)際情況設(shè)置其他計(jì)算n個(gè)線程出隊(duì)pop的偏移量的處理方法,本發(fā)明實(shí)施例對此不加以限制。另外,除了上述計(jì)算n個(gè)線程出隊(duì)pop的偏移量的處理方法外,本領(lǐng)域技術(shù)人員還可以根據(jù)實(shí)際需要采用其它計(jì)算n個(gè)線程出隊(duì)pop的偏移量的處理方法,本發(fā)明實(shí)施例對此也不加以限制。
[0526]子步驟S404,依據(jù)所述n個(gè)線程出隊(duì)pop的偏移量,分別計(jì)算所述n個(gè)線程出隊(duì)pop的實(shí)際位置Pos ;
[0527]在具體實(shí)現(xiàn)中,為了保證讀取數(shù)據(jù)不超出消息隊(duì)列的范圍,可以分別計(jì)算所述n個(gè)線程出隊(duì)pop的實(shí)際位置。[0528]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述子步驟S404具體可以包括如下子步驟:
[0529]子步驟D401,讀取所述消息隊(duì)列大小參數(shù)Size的值;
[0530]子步驟D402,采用所述Size的值對所述Poppos的值取模,獲得對應(yīng)的n個(gè)線程進(jìn)隊(duì)pop的實(shí)際位置Pos。
[0531]在實(shí)際應(yīng)用中,Pos=Poppos%Size, n個(gè)線程出隊(duì)pop的偏移量各不相同,因此,n個(gè)線程出隊(duì)pop的實(shí)際位置Pos也各不相同。這個(gè)時(shí)候?qū)嶋H位置Pos只有當(dāng)前線程獨(dú)自占有。
[0532]當(dāng)然,上述計(jì)算n個(gè)線程出隊(duì)pop的實(shí)際位置Pos的處理方法只是作為示例,在實(shí)施本發(fā)明實(shí)施例時(shí),可以根據(jù)實(shí)際情況設(shè)置其他計(jì)算n個(gè)線程出隊(duì)pop的實(shí)際位置Pos的處理方法,本發(fā)明實(shí)施例對此不加以限制。另外,除了上述計(jì)算n個(gè)線程出隊(duì)pop的實(shí)際位置Pos的處理方法外,本領(lǐng)域技術(shù)人員還可以根據(jù)實(shí)際需要采用其它計(jì)算n個(gè)線程出隊(duì)pop的實(shí)際位置Pos的處理方法,本發(fā)明實(shí)施例對此也不加以限制。
[0533]子步驟S405,所述n個(gè)線程分別在其出隊(duì)pop的實(shí)際位置執(zhí)行出隊(duì)pop操作。
[0534]在具體應(yīng)用中,計(jì)算出了 n個(gè)線程出隊(duì)pop的實(shí)際位置Pos,就可以在其出隊(duì)pop的實(shí)際位置Pos執(zhí)行出隊(duì)pop操作。
[0535]為便于本領(lǐng)域技術(shù)人員更好地理解本發(fā)明,以下通過一個(gè)具體示例簡單說明多線程出隊(duì)pop的方法。
[0536]參照圖7,示出了本發(fā)明一種多線程出隊(duì)pop的示意圖。如圖7所示,Threadl、Thread2、Thread3分別是線程1、線程2、線程3,圖示中消息隊(duì)列的各個(gè)方格表示實(shí)際位置。
[0537]在具體應(yīng)用中,線程1、線程2、線程3分別執(zhí)行出隊(duì)pop操作,線程2讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值,采用原子操作遞減CanReadCount的值,獲得遞減后的CanReadCount的值不為0,然后,讀取出隊(duì)pop的偏移量Poppos的值,采用偏移量Poppos的值執(zhí)行迭代增加操作,獲得該線程出隊(duì)pop的偏移量,之后,讀取消息隊(duì)列大小參數(shù)Size的值,采用Size的值對Poppos的值取模,得到實(shí)際位置,如圖7所示的消息隊(duì)列中第I個(gè)方格,此時(shí),第I個(gè)方格只有線程2獨(dú)自占有,線程2在第I個(gè)方格執(zhí)行出隊(duì)pop操作。線程I讀取線程2遞減后的可讀計(jì)數(shù)參數(shù)CanReadCount的值,在其基礎(chǔ)之上執(zhí)行遞減CanReadCount的值的操作,獲得遞減后的CanReadCount的值也不為0,然后,讀取線程2出隊(duì)pop的偏移量,在其基礎(chǔ)之上執(zhí)行迭代增加Poppos的值的操作,采用Size的值對Poppos的值取模,得至IJ實(shí)際位置,如圖7所示的消息隊(duì)列中第2個(gè)方格,此時(shí),第2個(gè)方格只有線程I獨(dú)自占有,線程I在第2個(gè)方格執(zhí)行出隊(duì)pop操作。線程3也按上述方法在如圖7所示的消息隊(duì)列中第3個(gè)方格執(zhí)行出隊(duì)pop操作。
[0538]通過采用消息隊(duì)列執(zhí)行單線程進(jìn)隊(duì)push以及多線程出隊(duì)pop的操作,利用原子操作計(jì)算多線程出隊(duì)pop的偏移量,避免了多線程出隊(duì)pop對應(yīng)的偏移量互相重復(fù),從而計(jì)算出多線程出隊(duì)pop不同的實(shí)際位置,保證了多線程訪問操作不碰撞,利用單個(gè)線程依次有序執(zhí)行進(jìn)隊(duì)push操作,解決了線程間通信時(shí)阻塞的問題,減少了資源消耗,充分利用了系統(tǒng)資源,提高了處理速度,從而提高了服務(wù)器吞吐量。
[0539]參照圖8,示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種基于消息隊(duì)列的共享內(nèi)存讀寫方法實(shí)施例的步驟流程圖,所述消息隊(duì)列包括第一消息隊(duì)列和第二消息隊(duì)列,具體可以包括如下步驟:[0540]步驟301,采用第一消息隊(duì)列執(zhí)行多線程進(jìn)隊(duì)push以及單線程出隊(duì)pop的操作;
[0541]在具體實(shí)現(xiàn)中,通過一個(gè)第一消息隊(duì)列執(zhí)行多線程進(jìn)隊(duì)push以及單線程出隊(duì)pop的操作,數(shù)據(jù)就可以被寫入共享內(nèi)存。
[0542]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述步驟301具體可以包括如下子步驟:
[0543]子步驟S501,讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值;
[0544]子步驟S502,遞減所述CanWriteCount的值;
[0545]子步驟S503,若獲得遞減后的CanWriteCount的值不為0,則判定所述第一消息隊(duì)列為未滿;
[0546]子步驟S504,在所述第一消息隊(duì)列未滿時(shí),分別計(jì)算n個(gè)線程進(jìn)隊(duì)push的偏移量;所述n為大于或等于I的正整數(shù);
[0547]子步驟S505,依據(jù)所述n個(gè)線程進(jìn)隊(duì)push的偏移量,分別計(jì)算所述n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置;
[0548]子步驟S506,所述n個(gè)線程分別在其進(jìn)隊(duì)push的實(shí)際位置執(zhí)行進(jìn)隊(duì)push操作;
[0549]子步驟S507,讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值;
[0550]子步驟S508,按照所述n個(gè)線程進(jìn)隊(duì)push的操作,迭代增加所述CanReadCount的值。
[0551]在具體實(shí)施中,可以采用可寫計(jì)數(shù)參數(shù)CanWriteCount的值判斷消息隊(duì)列是否已滿,可寫計(jì)數(shù)參數(shù)CanWriteCount的值為0,則消息隊(duì)列已滿,否則為未滿。n的取值取決于任務(wù)數(shù)量,一個(gè)任務(wù)分配一個(gè)線程,偏移量是指存儲(chǔ)單元的實(shí)際地址與其所在段的段地址之間的距離,n個(gè)線程進(jìn)隊(duì)push操作時(shí),每個(gè)線程都是采用原子操作遞加的方式,計(jì)算出來n個(gè)線程進(jìn)隊(duì)push的偏移量各不相同。為了保證寫入數(shù)據(jù)不超出消息隊(duì)列的范圍,可以采用n個(gè)線程進(jìn)隊(duì)push的偏移量分別計(jì)算所述n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置Pos。計(jì)算出了 n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置Pos,就可以在其進(jìn)隊(duì)push的實(shí)際位置Pos執(zhí)行進(jìn)隊(duì)push操作。可讀計(jì)數(shù)參數(shù)CanReadCount是判斷消息隊(duì)列是否已空的依據(jù),可讀計(jì)數(shù)參數(shù)CanReadCount的值為0時(shí),消息隊(duì)列已空,否則消息隊(duì)列未空。
[0552]具體地,執(zhí)行多線程進(jìn)隊(duì)push操作時(shí),每一個(gè)線程分別讀取對應(yīng)的可寫計(jì)數(shù)參數(shù)CanWriteCount的值,采用原子操作遞減CanWriteCount的值,若獲得遞減后的CanffriteCount的值為0,則判定所述第一消息隊(duì)列為已滿,否則,判定所述第一消息隊(duì)列為未滿。若所述第一消息隊(duì)列已滿,則禁止執(zhí)行進(jìn)隊(duì)push的操作。一個(gè)線程讀取進(jìn)隊(duì)push的偏移量Pushpos的值,采用當(dāng)前偏移量Pushpos的值執(zhí)行迭代增加操作,獲得該線程進(jìn)隊(duì)push的偏移量,下一個(gè)線程讀取迭代增加操作后的進(jìn)隊(duì)push的偏移量Pushpos的值,執(zhí)行迭代增加操作,獲得此線程進(jìn)隊(duì)push的偏移量,按上述方法依次針對所述n個(gè)線程迭代增加所述Pushpos的值,分別獲得所述n個(gè)線程進(jìn)隊(duì)push的偏移量。n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置PoS=PUShpOS%Size,由于n個(gè)線程進(jìn)隊(duì)push的偏移量各不相同,因此,n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置Pos也各不相同。這個(gè)時(shí)候?qū)嶋H位置Pos只有當(dāng)前線程獨(dú)自占有。當(dāng)前線程在獨(dú)自占有的實(shí)際位置Pos執(zhí)行進(jìn)隊(duì)push的操作,同時(shí),讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值,迭代增加所述CanReadCount的值。
[0553]當(dāng)然,上述執(zhí)行多線程進(jìn)隊(duì)push的操作將數(shù)據(jù)寫入第一消息隊(duì)列的處理方法只是作為示例,在實(shí)施本發(fā)明實(shí)施例時(shí),可以根據(jù)實(shí)際情況設(shè)置其他執(zhí)行多線程進(jìn)隊(duì)push的操作將數(shù)據(jù)寫入第一消息隊(duì)列的處理方法,本發(fā)明實(shí)施例對此不加以限制。另外,除了上述執(zhí)行多線程進(jìn)隊(duì)push的操作將數(shù)據(jù)寫入第一消息隊(duì)列的處理方法外,本領(lǐng)域技術(shù)人員還可以根據(jù)實(shí)際需要采用其它執(zhí)行多線程進(jìn)隊(duì)push的操作將數(shù)據(jù)寫入第一消息隊(duì)列的處理方法,本發(fā)明實(shí)施例對此也不加以限制。
[0554]步驟302,將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存;
[0555]在具體應(yīng)用中,所述單線程出隊(duì)pop的數(shù)據(jù)可以不加鎖的寫入共享內(nèi)存。
[0556]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述步驟302具體可以包括如下子步驟:
[0557]子步驟S601,獲得所述單線程出隊(duì)pop的數(shù)據(jù)及其長度;
[0558]子步驟S602,檢查所述數(shù)據(jù)的長度是否超出共享內(nèi)存的長度界限;
[0559]子步驟S603,若否,則獲取所述共享內(nèi)存的讀偏移指針pRead和寫偏移指針pffrite ;
[0560]子步驟S604,依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置,并判斷所述數(shù)據(jù)是否可寫;
[0561]子步驟S605,若是,則在所述寫入位置寫入所述數(shù)據(jù);
[0562]在具體實(shí)施中,當(dāng)完成了單線程出隊(duì)pop的操作后,可以獲得單線程出隊(duì)pop的數(shù)據(jù)及其長度,該數(shù)據(jù)的長度不能超過共享內(nèi)存的最大長度,當(dāng)該數(shù)據(jù)的長度在共享內(nèi)存的長度界限內(nèi)時(shí),可以獲得共享內(nèi)存的映射文件,映射文件可以包括文件頭,可以獲得文件頭中包括的寫偏移指針PWrite和讀偏移指針pRead,并將讀偏移指針pRead快照到臨時(shí)變量中,這樣在進(jìn)行寫操作的時(shí)候與臨時(shí)變量中的讀偏移指針pRead不會(huì)發(fā)生變化,寫操作中寫偏移指針PWrite的位置不可以超過臨時(shí)變量中的讀偏移指針pRead的位置,依據(jù)讀偏移指針pRead和寫偏移指針pWrite的相對位置決定寫入數(shù)據(jù)所在共享內(nèi)存中的位置,結(jié)合數(shù)據(jù)的長度確定開始和結(jié)束寫入數(shù)據(jù)時(shí)的位置。
[0563]步驟303,從所述共享內(nèi)存中讀取數(shù)據(jù);
[0564]在具體應(yīng)用中,從所述共享內(nèi)存中讀取數(shù)據(jù)可以不加鎖的實(shí)現(xiàn)。讀取數(shù)據(jù)和寫入數(shù)據(jù)的操作可以同時(shí)進(jìn)行,當(dāng)次寫入的數(shù)據(jù)可以在后一次讀取數(shù)據(jù)的操作中讀取。
[0565]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述步驟303具體可以包括如下子步驟:
[0566]子步驟S701,定位待讀取數(shù)據(jù)所在共享內(nèi)存的位置;
[0567]子步驟S702,獲得所述待讀取數(shù)據(jù)的長度;
[0568]子步驟S703,獲取所述共享內(nèi)存的讀偏移指針pRead和寫偏移指針pWrite ;
[0569]子步驟S704,依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述待讀取數(shù)據(jù)的長度,判斷所述待讀取數(shù)據(jù)是否可讀;
[0570]子步驟S705,若是,則從所述待讀取數(shù)據(jù)所在共享內(nèi)存的位置,讀出所述待讀取數(shù)據(jù);
[0571]在具體實(shí)施中,可以定位數(shù)據(jù)所在共享內(nèi)存的位置,并獲得數(shù)據(jù)的長度,讀取共享內(nèi)存的映射文件的文件頭,可以獲取讀偏移指針PRead和寫偏移指針pWrite,并把寫偏移指針pWrite快照到臨時(shí)變量中,這樣執(zhí)行寫操作而移動(dòng)寫偏移指針pWrite的位置時(shí),讀操作的內(nèi)存由于把寫偏移指針PWrite快照到臨時(shí)變量中可以不發(fā)生改變,因而讀操作和寫操作可以同時(shí)進(jìn)行。根據(jù)讀偏移指針PRead和寫偏移指針pWrite的相對位置決定數(shù)據(jù)所在共享內(nèi)存中的位置,并結(jié)合數(shù)據(jù)的長度決定開始和結(jié)束讀取數(shù)據(jù)的位置。[0572]步驟304,將讀出的數(shù)據(jù)通過單線程進(jìn)隊(duì)push的操作壓入所述第二消息隊(duì)列,同時(shí),采用所述第二消息隊(duì)列執(zhí)行多線程出隊(duì)pop的操作;
[0573]在具體應(yīng)用中,數(shù)據(jù)最終是由多線程讀取,采用執(zhí)行多線程出隊(duì)pop的操作從所述第二消息隊(duì)列中讀取所述數(shù)據(jù)可以不加鎖的實(shí)現(xiàn),并且進(jìn)隊(duì)push和出隊(duì)pop操作可以同時(shí)進(jìn)行。
[0574]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述步驟304具體可以包括如下子步驟:
[0575]子步驟S801,讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值;
[0576]子步驟S802,遞減所述CanReadCount的值;
[0577]子步驟S803,若獲得遞減后的CanReadCount的值不為0,則判定所述第二消息隊(duì)列為未空;
[0578]子步驟S804,在所述消息隊(duì)列未空時(shí),分別計(jì)算n個(gè)線程出隊(duì)pop的偏移量;所述n為大于或等于I的正整數(shù);
[0579]子步驟S805,依據(jù)所述n個(gè)線程出隊(duì)pop的偏移量,分別計(jì)算所述n個(gè)線程出隊(duì)pop的實(shí)際位置;
[0580]子步驟S806,所述n個(gè)線程分別在其出隊(duì)pop的實(shí)際位置執(zhí)行出隊(duì)pop操作;
[0581]子步驟S807,讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值;
[0582]子步驟S808,按照所述n個(gè)線程出隊(duì)pop的操作,迭代增加所述CanWriteCount的值。
[0583]在具體實(shí)施中,可以采用讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值判斷消息隊(duì)列是否已空,讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值為0,則消息隊(duì)列已空,否則為未空。n個(gè)線程出隊(duì)pop操作時(shí),每個(gè)線程都是采用原子操作遞加的方式,計(jì)算出來n個(gè)線程出隊(duì)pop的偏移量各不相同。為了保證讀取數(shù)據(jù)不超出消息隊(duì)列的范圍,可以分別計(jì)算所述n個(gè)線程出隊(duì)pop的實(shí)際位置。計(jì)算出了 n個(gè)線程出隊(duì)pop的實(shí)際位置Pos,就可以在其出隊(duì)pop的實(shí)際位置Pos執(zhí)行出隊(duì)pop操作??蓪懹?jì)數(shù)參數(shù)CanWriteCount是判斷消息隊(duì)列是否已滿的依據(jù),可寫計(jì)數(shù)參數(shù)CanWriteCount的值為0時(shí),消息隊(duì)列已滿,否則消息隊(duì)列為未滿。
[0584]具體而言,多線程進(jìn)隊(duì)pop操作時(shí),每一個(gè)線程分別讀取對應(yīng)的可讀計(jì)數(shù)參數(shù)CanReadCount的值,采用原子操作遞減CanReadCount的值,若獲得遞減后的CanReadCount的值為0,則判定所述消息隊(duì)列為已空,否則,判定所述消息隊(duì)列為未空。若所述消息隊(duì)列已空,貝1J禁止執(zhí)行出隊(duì)pop的操作。一個(gè)線程讀取出隊(duì)pop的偏移量Poppos的值,采用當(dāng)前偏移量Poppos的值執(zhí)行迭代增加操作,獲得該線程出隊(duì)pop的偏移量,下一個(gè)線程讀取迭代增加操作后的出隊(duì)pop的偏移量Poppos的值,執(zhí)行迭代增加操作,獲得此線程出隊(duì)pop的偏移量,按上述方法依次針對所述n個(gè)線程迭代增加所述Poppos的值,分別獲得所述n個(gè)線程出隊(duì)pop的偏移量。Pos=Poppos%Size,n個(gè)線程出隊(duì)pop的偏移量各不相同,因此,n個(gè)線程出隊(duì)pop的實(shí)際位置Pos也各不相同。這個(gè)時(shí)候?qū)嶋H位置Pos只有當(dāng)前線程獨(dú)自占有。當(dāng)前線程在獨(dú)自占有的實(shí)際位置Pos執(zhí)行出隊(duì)pop的操作,同時(shí),讀取可寫計(jì)數(shù)參數(shù)CanffriteCount的值,迭代增加所述CanWriteCount的值。
[0585]本發(fā)明通過第一消息隊(duì)列、第二消息隊(duì)列以及共享內(nèi)存的組合進(jìn)行通信,數(shù)據(jù)的處理速度相當(dāng)于內(nèi)存拷貝數(shù)據(jù)的速度,突破了傳輸?shù)钠款i,從而提高服務(wù)器吞吐量。
[0586]本發(fā)明通過采用第一消息隊(duì)列執(zhí)行多線程進(jìn)隊(duì)push以及單線程出隊(duì)pop的操作,和,采用第二消息隊(duì)列執(zhí)行單線程進(jìn)隊(duì)push以及多線程出隊(duì)pop的操作,可以保證多線程訪問操作不碰撞,避免使用互斥鎖來解決多線程并發(fā)爭用安全性的問題,并且,多線程進(jìn)隊(duì)push和單線程出隊(duì)pop的操作可以同時(shí)進(jìn)行,解決了線程間通信時(shí)阻塞的問題,減少了資源消耗,充分利用了系統(tǒng)資源,提高了處理速度,從而提高了服務(wù)器吞吐量。
[0587]本發(fā)明通過將所述數(shù)據(jù)寫入共享內(nèi)存,可以不加鎖的控制寫入數(shù)據(jù),避免了加鎖造成的阻塞的問題,從而減少資源消耗,充分利用系統(tǒng)資源,提高處理速度,提高服務(wù)器吞吐量。
[0588]本發(fā)明通過從所述共享內(nèi)存中讀取所述數(shù)據(jù),可以不加鎖的控制讀出數(shù)據(jù),避免了加鎖造成的阻塞的問題,從而減少資源消耗,充分利用系統(tǒng)資源,提高處理速度,提高服
務(wù)器吞吐量。
[0589]參照圖9,示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種基于消息隊(duì)列的共享內(nèi)存寫入方法實(shí)施例2的步驟流程圖,所述消息隊(duì)列包括第一消息隊(duì)列,具體可以包括如下步驟:
[0590]步驟401,在存在多個(gè)消息隊(duì)列時(shí),選定用于當(dāng)前通信的第一消息隊(duì)列;
[0591]在實(shí)際應(yīng)用中,當(dāng)采用多個(gè)消息隊(duì)列進(jìn)行通信時(shí),數(shù)據(jù)可以分段發(fā)送,所有分段數(shù)據(jù)可以自由選擇消息隊(duì)列進(jìn)行通信,可能會(huì)出現(xiàn)某一消息隊(duì)列上負(fù)載的分段數(shù)據(jù)遠(yuǎn)遠(yuǎn)超過其他消息隊(duì)列,會(huì)影響處理速度,造成各個(gè)CPU使用率不均衡,因此,需要選定用于當(dāng)前通信的第一消息隊(duì)列以均衡多個(gè)消息隊(duì)列的負(fù)載。
[0592]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述步驟401具體可以包括如下子步驟:
[0593]子步驟S901,讀取所述數(shù)據(jù)的協(xié)議中的上下文參數(shù)intnld ;
[0594]子步驟S902,采用所述上下文參數(shù)intnld對所述多個(gè)消息隊(duì)列的個(gè)數(shù)取模;
[0595]子步驟S903,提取所述取模的值對應(yīng)的消息隊(duì)列為用于當(dāng)前通信的第一消息隊(duì)列。
[0596]在具體應(yīng)用中,數(shù)據(jù)的協(xié)議中設(shè)置上下文參數(shù)intnld,每一段數(shù)據(jù)分配一個(gè)上下文參數(shù)intnld,后一段數(shù)據(jù)的上下文參數(shù)intnld通過前一段數(shù)據(jù)的上下文參數(shù)intnld執(zhí)行原子操作加得到,然后每一段數(shù)據(jù)選擇緩沖通道時(shí),采用該段數(shù)據(jù)對應(yīng)的上下文參數(shù)intnld對緩沖通道的個(gè)數(shù)進(jìn)行取模操作,采用取模操作后得到的值確定為數(shù)據(jù)發(fā)送時(shí)采用的對應(yīng)序號(hào)的緩沖通道,以及,關(guān)聯(lián)為同一段數(shù)據(jù)返回時(shí)采用的關(guān)聯(lián)序號(hào)的緩沖通道。
[0597]新增一段數(shù)據(jù),上下文參數(shù)intnld就執(zhí)行一次原子操作加,這樣取模得到的數(shù)目就均衡了,每一個(gè)緩沖通道都均衡地有任務(wù)可以執(zhí)行。而且保證同一段數(shù)據(jù)發(fā)送和返回使用的緩沖通道相互關(guān)聯(lián)。
[0598]步驟402,采用所述消息隊(duì)列執(zhí)行多線程進(jìn)隊(duì)push以及單線程出隊(duì)pop的操作;
[0599]步驟403,將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存;
[0600]本實(shí)施例與上述寫入方法實(shí)施例1的區(qū)別之處在于,本實(shí)施例增加了在存在多個(gè)消息隊(duì)列時(shí),選定用于當(dāng)前通信的第一消息隊(duì)列。選定第一消息隊(duì)列是為了均衡各個(gè)消息隊(duì)列上的負(fù)載,提高處理速度,有效避免出現(xiàn)某個(gè)消息隊(duì)列負(fù)載遠(yuǎn)遠(yuǎn)大于其他消息隊(duì)列的負(fù)載的情況,從而減少各個(gè)CPU之間使用率的差值,提高服務(wù)器吞吐量。
[0601]為便于本領(lǐng)域技術(shù)人員更好地理解本發(fā)明步驟401,以下以多消息隊(duì)列為例,簡單說明在存在多個(gè)消息隊(duì)列時(shí),選定用于當(dāng)前通信的第一消息隊(duì)列的方法。
[0602]參照圖10,示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種采用多個(gè)消息隊(duì)列通信的示意圖。如圖10所示,從上至下一共有5個(gè)第一消息隊(duì)列、5個(gè)共享內(nèi)存和5個(gè)第二消息隊(duì)列,每一個(gè)共享內(nèi)存和對應(yīng)的一個(gè)第一消息隊(duì)列以及對應(yīng)的一個(gè)第二消息隊(duì)列的組合都可以執(zhí)行多線程寫入數(shù)據(jù)和多線程讀取數(shù)據(jù)。
[0603]具體而言,當(dāng)有數(shù)據(jù)需要多個(gè)消息隊(duì)列進(jìn)行通信時(shí),讀取數(shù)據(jù)協(xié)議中的上下文參數(shù)intnld,每一個(gè)上下文參數(shù)intnld對應(yīng)一段數(shù)據(jù),采用上下文參數(shù)intnld對多個(gè)消息隊(duì)列的個(gè)數(shù)取模,依據(jù)所述取模的值,確定所述上下文參數(shù)intnld對應(yīng)的數(shù)據(jù)采用的消息隊(duì)列。當(dāng)同一段數(shù)據(jù)需要返回時(shí),該段數(shù)據(jù)對應(yīng)的上下文參數(shù)intnld在確定發(fā)送數(shù)據(jù)時(shí)采用的消息隊(duì)列的同時(shí),會(huì)關(guān)聯(lián)返回消息隊(duì)列中同一個(gè)序號(hào)的消息隊(duì)列供返回?cái)?shù)據(jù)時(shí)使用。即采用每一個(gè)上下文參數(shù)intnld除以緩沖通道的個(gè)數(shù)5,得到一個(gè)余數(shù),依據(jù)這個(gè)余數(shù),確定每一個(gè)上下文參數(shù)intnld對應(yīng)的數(shù)據(jù)采用的消息隊(duì)列,定義如圖10所示的5個(gè)第一消息隊(duì)列從上至下的序號(hào)分別為0、1、2、3、4,則取模得到的余數(shù)可以對應(yīng)相同序號(hào)的消息隊(duì)列,采用相同序號(hào)的消息隊(duì)列進(jìn)行通信。若上下文參數(shù)intnld取模得到的余數(shù)為0,則采用序號(hào)0的消息隊(duì)列發(fā)送數(shù)據(jù),當(dāng)此上下文參數(shù)intnld對應(yīng)的同一段數(shù)據(jù)需要返回時(shí),則余數(shù)為0的上下文參數(shù)intnld采用關(guān)聯(lián)序號(hào)0的返回消息隊(duì)列返回?cái)?shù)據(jù),以保證發(fā)送和返回?cái)?shù)據(jù)采用同一個(gè)序號(hào)的消息隊(duì)列,從而保證采用相同的線程進(jìn)行通信。
[0604]當(dāng)然,上述均衡所述多個(gè)緩沖通道的負(fù)載的處理方法只是作為示例,在實(shí)施本發(fā)明實(shí)施例時(shí),可以根據(jù)實(shí)際情況設(shè)置其他均衡所述多個(gè)緩沖通道的負(fù)載的處理方法,本發(fā)明實(shí)施例對此不加以限制。另外,除了上述均衡所述多個(gè)緩沖通道的負(fù)載的處理方法外,本領(lǐng)域技術(shù)人員還可以根據(jù)實(shí)際需要采用其它均衡所述多個(gè)緩沖通道的負(fù)載的處理方法,本發(fā)明實(shí)施例對此也不加以限制。
[0605]對于方法實(shí)施例,為了簡單描述,故將其都表述為一系列的動(dòng)作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本發(fā)明實(shí)施例并不受所描述的動(dòng)作順序的限制,因?yàn)橐罁?jù)本發(fā)明實(shí)施例,某些步驟可以采用其他順序或者同時(shí)進(jìn)行。其次,本領(lǐng)域技術(shù)人員也應(yīng)該知悉,說明書中所描述的實(shí)施例均屬于優(yōu)選實(shí)施例,所涉及的動(dòng)作并不一定是本發(fā)明實(shí)施例所必須的。
[0606]參照圖11,示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種基于消息隊(duì)列的共享內(nèi)存寫入系統(tǒng)實(shí)施例的結(jié)構(gòu)框圖,所述消息隊(duì)列包括第一消息隊(duì)列,具體可以包括如下模塊:
[0607]多線程進(jìn)隊(duì)push模塊501及單線程出隊(duì)pop模塊502,用于采用所述消息隊(duì)列執(zhí)行多線程進(jìn)隊(duì)push以及單線程出隊(duì)pop的操作;
[0608]數(shù)據(jù)寫入模塊503,用于將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存;
[0609]其中,所述多線程進(jìn)隊(duì)push模塊501包括:
[0610]第一判斷子模塊,用于判斷所述消息隊(duì)列是否已滿;
[0611]進(jìn)隊(duì)push偏移量計(jì)算子模塊,用于在消息隊(duì)列未滿時(shí),分別計(jì)算n個(gè)線程進(jìn)隊(duì)push的偏移量;所述n為大于或等于I的正整數(shù);
[0612]進(jìn)隊(duì)push的實(shí)際位置Pos計(jì)算子模塊,用于依據(jù)所述n個(gè)線程進(jìn)隊(duì)push的偏移量,分別計(jì)算所述n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置Pos ;
[0613]操作進(jìn)隊(duì)push子模塊,用于所述n個(gè)線程分別在其進(jìn)隊(duì)push的實(shí)際位置Pos執(zhí)行進(jìn)隊(duì)push操作;
[0614]其中,數(shù)據(jù)寫入模塊503包括:
[0615]數(shù)據(jù)及其長度獲得子模塊,用于獲得所述單線程出隊(duì)pop的數(shù)據(jù)及其長度;[0616]界限檢查子模塊,用于檢查所述數(shù)據(jù)的長度是否超出共享內(nèi)存的長度界限;
[0617]第一指針獲取子模塊,用于在所述數(shù)據(jù)的長度未超出共享內(nèi)存的長度界限時(shí),獲取所述共享內(nèi)存的讀偏移指針PRead和寫偏移指針pWrite ;
[0618]可寫判斷子模塊,用于依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置,并判斷所述數(shù)據(jù)是否可寫;
[0619]寫入子模塊,用于在數(shù)據(jù)可寫時(shí),在所述寫入位置寫入所述數(shù)據(jù)。
[0620]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述系統(tǒng)還包括:
[0621]第一消息隊(duì)列選定模塊,用于在存在多個(gè)消息隊(duì)列時(shí),選定用于當(dāng)前通信的第一消息隊(duì)列。
[0622]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述第一消息隊(duì)列選定模塊包括:
[0623]上下文參數(shù)讀取子模塊,用于讀取所述數(shù)據(jù)的協(xié)議中的上下文參數(shù)intnld ;
[0624]取模子模塊,用于采用所述上下文參數(shù)intnld對所述多個(gè)消息隊(duì)列的個(gè)數(shù)取模;
[0625]提取子模塊,用于提取所述取模的值對應(yīng)的消息隊(duì)列為用于當(dāng)前通信的第一消息隊(duì)列。
[0626]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述第一判斷子模塊包括:
[0627]可寫計(jì)數(shù)參數(shù)讀取子模塊,用于讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值;
[0628]可寫計(jì)數(shù)參數(shù)遞減子模塊,用于遞減所述CanWriteCount的值;
[0629]第一判斷子模塊,用于在獲得遞減后的CanWriteCount的值為0,則判定所述消息隊(duì)列為已滿,否則,判定所述消息隊(duì)列為未滿。
[0630]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述進(jìn)隊(duì)push偏移量計(jì)算子模塊包括:
[0631]偏移量Pushpos讀取子模塊,用于讀取進(jìn)隊(duì)push的偏移量Pushpos的值;
[0632]偏移量Pushpos獲得子模塊,用于針對所述n個(gè)線程迭代增加所述Pushpos的值,分別獲得所述n個(gè)線程進(jìn)隊(duì)push的偏移量。
[0633]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述進(jìn)隊(duì)push的實(shí)際位置Pos計(jì)算子模塊包括:
[0634]第一大小參數(shù)Size讀取子模塊,用于讀取所述消息隊(duì)列大小參數(shù)Size的值;
[0635]進(jìn)隊(duì)push的實(shí)際位置Pos獲得子模塊,用于獲得對應(yīng)的n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置Pos。
[0636]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述多線程進(jìn)隊(duì)push子模塊還包括:
[0637]可讀計(jì)數(shù)參數(shù)讀取子模塊,讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值;
[0638]可讀計(jì)數(shù)參數(shù)讀迭代增加子模塊,按照所述n個(gè)線程進(jìn)隊(duì)push的操作,迭代增加所述 CanReadCount 的值。
[0639]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述單線程出隊(duì)pop模塊包括:
[0640]出隊(duì)pop子模塊,用于單個(gè)線程依次在所述消息隊(duì)列中執(zhí)行出隊(duì)pop操作。
[0641]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述多線程進(jìn)隊(duì)push模塊還包括:
[0642]進(jìn)隊(duì)push的操作禁止子模塊,用于在所述消息隊(duì)列已滿時(shí),禁止執(zhí)行進(jìn)隊(duì)push的操作。
[0643]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述數(shù)據(jù)寫入模塊還包括:
[0644]禁止寫入子模塊,用于在所述數(shù)據(jù)的長度超出共享內(nèi)存的長度界限,則禁止寫入。
[0645]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述可寫判斷子模塊包括:[0646]第一寫入位置確定子模塊,用于依據(jù)所述寫偏移指針pWrite確定所述數(shù)據(jù)在共孕內(nèi)存中的與入位置;
[0647]第一可寫判定子模塊,用于當(dāng)所述讀偏移指針pRead和寫偏移指針pWrite處于同一位置時(shí),判定所述數(shù)據(jù)可寫。
[0648]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述可寫判斷子模塊還包括:
[0649]第二寫入位置確定子模塊,用于依據(jù)所述寫偏移指針pWrite確定所述數(shù)據(jù)在共孕內(nèi)存中的與入位置;
[0650]第一可寫數(shù)據(jù)長度設(shè)置子模塊,用于在所述讀偏移指針pRead處于所述寫偏移指針pWrite后面的位置時(shí),設(shè)置可寫數(shù)據(jù)的長度小于或等于allsize-pWrite+pRead-head,其中allsize為共享內(nèi)存的長度,所述head為文件頭的長度;
[0651]第三判斷子模塊,用于判斷所述數(shù)據(jù)的長度是否小于或等于所述可寫數(shù)據(jù)的長度;
[0652]第二可寫判定子模塊,用于所述數(shù)據(jù)的長度小于或等于所述可寫數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)可寫;
[0653]第一不可寫判定子模塊,用于所述數(shù)據(jù)的長度大于所述可寫數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)不可寫。
[0654]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述可寫判斷子模塊還包括:
[0655]第三寫入位置確定子模塊,用于依據(jù)所述寫偏移指針pWrite確定所述數(shù)據(jù)在共孕內(nèi)存中的與入位置;
[0656]第二可寫數(shù)據(jù)長度設(shè)置子模塊,用于在所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),設(shè)置可寫數(shù)據(jù)的長度小于或等于pRead-pWrite ;
[0657]第四判斷子模塊,用于判斷所述數(shù)據(jù)的長度是否小于或等于所述可寫數(shù)據(jù)的長度;
[0658]第三可寫判定子模塊,用于所述數(shù)據(jù)的長度小于或等于所述可寫數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)可寫;
[0659]第二不可寫判定子模塊,用于所述數(shù)據(jù)的長度大于所述可寫數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)不可寫。
[0660]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述第一指針獲取子模塊包括:
[0661]第一映射文件獲得子模塊,用于獲得所述共享內(nèi)存的映射文件,所述映射文件包括文件頭;
[0662]第一寫偏移指針pWrite讀取子模塊,用于從所述文件頭中讀取寫偏移指針pWrite ;
[0663]第一讀偏移指針pRead讀取子模塊,用于從所述文件頭中讀取讀偏移指針pRead并快照到臨時(shí)變量中。
[0664]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述寫入子模塊包括:
[0665]第一開始寫入子模塊,用于在所述讀偏移指針pRead和寫偏移指針pWrite處于同一位置時(shí),或,在所述讀偏移指針PRead處于所述寫偏移指針pWrite后面的位置時(shí),則從當(dāng)前寫偏移指針PWrite位置開始寫入所述數(shù)據(jù);
[0666]尾部寫入判斷子模塊,用于在寫入到所述共享內(nèi)存尾部的位置時(shí),判斷所述數(shù)據(jù)是否已全部寫入;
[0667]第一全部寫入子模塊,用于所述數(shù)據(jù)未全部寫入時(shí),從所述共享內(nèi)存中文件頭結(jié)束的位置開始繼續(xù)寫入所述數(shù)據(jù),直至在所述讀偏移指針PRead位置之前寫入全部的數(shù)據(jù)。
[0668]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述寫入子模塊包括:
[0669]第二開始寫入子模塊,用于在所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),則從當(dāng)前寫偏移指針PWrite位置開始寫入所述數(shù)據(jù);
[0670]第二全部寫入子模塊,用于在所述讀偏移指針pRead位置之前寫入全部的數(shù)據(jù)。
[0671]在本發(fā)明的一種優(yōu)選實(shí)施例中,采用內(nèi)存拷貝memcpy的方式寫入所述數(shù)據(jù)
[0672]對于圖11所示的系統(tǒng)實(shí)施例而言,由于其與圖1所示的方法實(shí)施例基本相似,所以描述的比較簡單,相關(guān)之處參見方法實(shí)施例的部分說明即可。
[0673]參照圖12,示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種基于消息隊(duì)列的共享內(nèi)存讀取系統(tǒng)實(shí)施例的結(jié)構(gòu)框圖,所述消息隊(duì)列包括第二消息隊(duì)列,具體可以包括如下模塊:
[0674]數(shù)據(jù)讀取模塊601,用于從共享內(nèi)存中讀取數(shù)據(jù);
[0675]單線程進(jìn)隊(duì)push模塊602及多線程出隊(duì)pop模塊603,用于將讀出的數(shù)據(jù)通過單線程進(jìn)隊(duì)push的操作壓入所述第二消息隊(duì)列,同時(shí),采用所述第二消息隊(duì)列執(zhí)行多線程出隊(duì)pop的操作;
[0676]其中,所述數(shù)據(jù)讀取模塊601包括:
[0677]定位子模塊,用于定位數(shù)據(jù)所在共享內(nèi)存的位置;
[0678]數(shù)據(jù)長度獲得子模塊,用于獲得所述數(shù)據(jù)的長度;
[0679]第二指針獲取子模塊,用于獲取所述共享內(nèi)存的讀偏移指針pRead和寫偏移指針pWrite ;
[0680]可讀判斷子模塊,用于依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,判斷所述數(shù)據(jù)是否可讀;
[0681]讀取子模塊,用于在所述數(shù)據(jù)可讀時(shí),從所述數(shù)據(jù)所在共享內(nèi)存的位置,讀出所述數(shù)據(jù)。
[0682]其中,所述多線程出隊(duì)pop模塊603包括:
[0683]第二判斷子模塊,用于判斷所述消息隊(duì)列是否已空;
[0684]出隊(duì)pop的偏移量計(jì)算子模塊,用于在消息隊(duì)列未空時(shí),分別計(jì)算n個(gè)線程出隊(duì)pop的偏移量;所述n為大于或等于I的正整數(shù);
[0685]出隊(duì)pop的實(shí)際位置Pos計(jì)算子模塊,用于依據(jù)所述n個(gè)線程出隊(duì)pop的偏移量,分別計(jì)算所述n個(gè)線程出隊(duì)pop的實(shí)際位置Pos ;
[0686]操作出隊(duì)pop子模塊,用于所述n個(gè)線程分別在其出隊(duì)pop的實(shí)際位置執(zhí)行出隊(duì)pop操作。
[0687]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述數(shù)據(jù)讀取模塊還包括:
[0688]返回子模塊,用于在所述數(shù)據(jù)不可讀時(shí),返回?cái)?shù)據(jù)為空。
[0689]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述可讀判斷子模塊包括:
[0690]第一可讀數(shù)據(jù)長度設(shè)置子模塊,用于在所述讀偏移指針pRead處于所述寫偏移指針pWrite后面的位置時(shí),設(shè)置可讀數(shù)據(jù)的長度小于或等于pWrite-pRead ;[0691]第一判斷子模塊,用于判斷所述數(shù)據(jù)的長度是否小于或等于所述可讀數(shù)據(jù)的長度;
[0692]第一可讀判定子模塊,用于所述數(shù)據(jù)的長度小于或等于所述可讀數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)可讀;
[0693]第一不可讀判定子模塊,用于所述數(shù)據(jù)的長度大于所述可讀數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)不可讀。
[0694]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述可讀判斷子模塊還包括:
[0695]第二可讀數(shù)據(jù)長度設(shè)置子模塊,用于當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),設(shè)置可讀數(shù)據(jù)的長度小于或等于allsize-pRead+pWrite-head,其中,所述allsize為共享內(nèi)存的長度,所述head為文件頭的長度;
[0696]第二判斷子模塊,用于判斷所述數(shù)據(jù)的長度是否小于或等于所述可讀數(shù)據(jù)的長度;
[0697]第二可讀判定子模塊,用于所述數(shù)據(jù)的長度小于或等于所述可讀數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)可讀;
[0698]第二不可讀判定子模塊,用于所述數(shù)據(jù)的長度大于所述可讀數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)不可讀。
[0699]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述可讀判斷子模塊還包括:
[0700]第三不可讀判定子模塊,用于在所述讀偏移指針pRead和寫偏移指針pWrite處于同一位置時(shí),判定所述數(shù)據(jù)不可讀。
[0701]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述第二指針獲取子模塊包括:
[0702]第二映射文件獲得子模塊,用于獲得所述共享內(nèi)存的映射文件,所述映射文件包括文件頭;
[0703]第二讀偏移指針pRead讀取子模塊,用于從所述文件頭中讀取讀偏移指針pRead ;
[0704]第二寫偏移指針pWrite讀取子模塊,用于從所述文件頭中讀取寫偏移指針pWrite并快照到臨時(shí)變量中。
[0705]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述讀取子模塊包括:
[0706]第一開始讀取子模塊,用于在所述讀偏移指針pRead處于所述寫偏移指針pWrite后面的位置時(shí),從當(dāng)前讀偏移指針PRead位置開始讀出所述數(shù)據(jù);
[0707]第一全部讀取子模塊,用于在不超過所述寫偏移指針pWrite位置讀出全部的數(shù)據(jù)。
[0708]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述讀取模塊包括:
[0709]第二開始讀取子模塊,用于在所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),從當(dāng)前讀偏移指針PRead位置開始讀出所述數(shù)據(jù);
[0710]尾部讀取判斷子模塊,用于在讀取至所述共享內(nèi)存尾部的位置時(shí),判斷所述數(shù)據(jù)是否已全部讀出;
[0711]第二全部讀取子模塊,用于在所述數(shù)據(jù)未全部讀出時(shí),從所述共享內(nèi)存中文件頭結(jié)束的位置開始繼續(xù)讀出所述數(shù)據(jù),直至在不超過所述寫偏移指針PWrite位置讀出全部的數(shù)據(jù)。
[0712]在本發(fā)明的一種優(yōu)選實(shí)施例中,采用內(nèi)存拷貝memcpy的方式讀出所述數(shù)據(jù)。[0713]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述第二判斷子模塊包括:
[0714]可讀計(jì)數(shù)參數(shù)讀取子模塊,用于讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值;
[0715]可讀計(jì)數(shù)參數(shù)遞減子模塊,用于遞減所述CanReadCount的值;
[0716]第二判斷子模塊,用于在獲得遞減后的CanReadCount的值為0,則判定所述消息隊(duì)列為已空,否則,判定所述消息隊(duì)列為未空。
[0717]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述出隊(duì)pop的偏移量計(jì)算子模塊還包括:
[0718]偏移量Poppos讀取子模塊,用于讀取出隊(duì)pop的偏移量Poppos的值;
[0719]偏移量Poppos獲得子模塊,用于針對所述n個(gè)線程迭代增加所述Poppos的值,分別獲得所述n個(gè)線程出隊(duì)pop的偏移量。
[0720]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述出隊(duì)pop的實(shí)際位置Pos計(jì)算子模塊包括:
[0721]第二大小參數(shù)讀取子模塊,用于讀取所述消息隊(duì)列大小參數(shù)Size的值;
[0722]出隊(duì)pop的實(shí)際位置Pos計(jì)算子模塊,用于采用所述Size的值對所述Poppos的值取模,獲得對應(yīng)的n個(gè)線程出隊(duì)pop的實(shí)際位置Pos。
[0723]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述多線程出隊(duì)pop模塊還包括:
[0724]可寫計(jì)數(shù)參數(shù)讀取子模塊,用于讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值;
[0725]可寫計(jì)數(shù)參數(shù)迭代增加子模塊,用于按照所述n個(gè)線程出隊(duì)pop的操作,迭代增加所述 CanWriteCount 的值。
[0726]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述單線程進(jìn)隊(duì)push模塊包括:
[0727]進(jìn)隊(duì)push子模塊,用于單個(gè)線程依次在所述消息隊(duì)列中執(zhí)行進(jìn)隊(duì)push操作。
[0728]在本發(fā)明的一種優(yōu)選實(shí)施例中,所述多線程出隊(duì)pop模塊還包括:
[0729]出隊(duì)pop的操作禁止子模塊,用于在所述消息隊(duì)列已空時(shí),則禁止執(zhí)行出隊(duì)pop的操作。
[0730]對于圖12所示的系統(tǒng)實(shí)施例而言,由于其與圖5所示的方法實(shí)施例基本相似,所以描述的比較簡單,相關(guān)之處參見方法實(shí)施例的部分說明即可。
[0731]參照圖13,示出了根據(jù)本發(fā)明一個(gè)實(shí)施例的一種基于消息隊(duì)列的共享內(nèi)存讀寫系統(tǒng)實(shí)施例的結(jié)構(gòu)框圖,所述消息隊(duì)列包括第一消息隊(duì)列和第二消息隊(duì)列,具體可以包括如下模塊:
[0732]第一進(jìn)隊(duì)push模塊701和第一出隊(duì)pop模塊702,用于米用第一消息隊(duì)列執(zhí)行多線程進(jìn)隊(duì)push以及單線程出隊(duì)pop的操作;
[0733]共享內(nèi)存寫入模塊703,用于將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存;
[0734]共享內(nèi)存讀取模塊704,用于從所述共享內(nèi)存中讀取數(shù)據(jù);
[0735]第二進(jìn)隊(duì)push模塊705和第二出隊(duì)pop模塊706,用于將所述數(shù)據(jù)采用第二消息隊(duì)列執(zhí)行單線程進(jìn)隊(duì)push以及多線程出隊(duì)pop的操作;
[0736]其中,所述第一進(jìn)隊(duì)push模塊701包括:
[0737]CanffriteCount參數(shù)讀取子模塊,用于讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值;
[0738]CanffriteCount參數(shù)遞減子模塊,用于遞減所述CanWriteCount的值;
[0739]第三判斷子模塊,用于在獲得遞減后的CanWriteCount的值不為0,則判定所述消息隊(duì)列為未滿;
[0740]push的偏移量計(jì)算子模塊,用于在所述消息隊(duì)列未滿時(shí),分別計(jì)算n個(gè)線程進(jìn)隊(duì)push的偏移量;所述n為大于或等于I的正整數(shù);
[0741]push的實(shí)際位置計(jì)算子模塊,用于依據(jù)所述n個(gè)線程進(jìn)隊(duì)push的偏移量,分別計(jì)算所述n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置;
[0742]push操作執(zhí)行子模塊,用于所述n個(gè)線程分別在其進(jìn)隊(duì)push的實(shí)際位置執(zhí)行進(jìn)隊(duì)push操作;
[0743]CanReadCount參數(shù)讀取子模塊,用于讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值;
[0744]CanReadCount參數(shù)迭加子模塊,用于按照所述n個(gè)線程進(jìn)隊(duì)push的操作,迭代增加所述CanReadCount的值;
[0745]其中,所述第二出隊(duì)pop模塊706包括:
[0746]CanReadCount參數(shù)讀取子模塊,用于讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值;
[0747]CanReadCount參數(shù)遞減子模塊,用于遞減所述CanReadCount的值;
[0748]第四判斷子模塊,用于在獲得遞減后的CanReadCount的值不為0,則判定所述消息隊(duì)列為未空;
[0749]pop的偏移量計(jì)算子模塊,用于在所述消息隊(duì)列未空時(shí),分別計(jì)算n個(gè)線程出隊(duì)pop的偏移量;所述n為大于或等于I的正整數(shù);
[0750]pop的實(shí)際位置計(jì)算子模塊,用于依據(jù)所述n個(gè)線程出隊(duì)pop的偏移量,分別計(jì)算所述n個(gè)線程出隊(duì)pop的實(shí)際位置;
[0751]pop操作執(zhí)行子模塊,用于所述n個(gè)線程分別在其出隊(duì)pop的實(shí)際位置執(zhí)行出隊(duì)pop操作;
[0752]CanffriteCount參數(shù)讀取子模塊,用于讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值;
[0753]CanffriteCount參數(shù)迭加子模塊,用于按照所述n個(gè)線程出隊(duì)pop的操作,迭代增加所述CanWriteCount的值。
[0754]其中,共享內(nèi)存寫入模塊703包括:
[0755]數(shù)據(jù)獲得子模塊,用于獲得所述單線程出隊(duì)pop的數(shù)據(jù)及其長度;
[0756]檢查子模塊,用于檢查所述數(shù)據(jù)的長度是否超出共享內(nèi)存的長度界限;
[0757]第三指針獲取子模塊,用于在所述數(shù)據(jù)的長度未超出共享內(nèi)存的長度界限時(shí),獲取所述共享內(nèi)存的讀偏移指針PRead和寫偏移指針pWrite ;
[0758]數(shù)據(jù)可寫判斷子模塊,用于依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置,并判斷所述數(shù)據(jù)是否可寫;
[0759]寫入數(shù)據(jù)子模塊,用于在數(shù)據(jù)可寫時(shí),在所述寫入位置寫入所述數(shù)據(jù);
[0760]其中,所述共享內(nèi)存讀取模塊704包括:
[0761]數(shù)據(jù)定位子模塊,用于定位待讀取數(shù)據(jù)所在共享內(nèi)存的位置;
[0762]長度獲得子模塊,用于獲得所述待讀取數(shù)據(jù)的長度;
[0763]第四指針獲取子模塊,用于獲取所述共享內(nèi)存的讀偏移指針pRead和寫偏移指針pWrite ;
[0764]數(shù)據(jù)可讀判斷子模塊,用于依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,判斷所述待讀取數(shù)據(jù)是否可讀;
[0765]讀取數(shù)據(jù)子模塊,用于在所述數(shù)據(jù)可讀時(shí),從所述數(shù)據(jù)所在共享內(nèi)存的位置,讀出所述待讀取數(shù)據(jù);[0766]對于圖13所示的系統(tǒng)實(shí)施例而言,由于其與圖8所示的方法實(shí)施例基本相似,所以描述的比較簡單,相關(guān)之處參見方法實(shí)施例的部分說明即可。
[0767]在此提供的算法和顯示不與任何特定計(jì)算機(jī)、虛擬系統(tǒng)或者其它設(shè)備固有相關(guān)。各種通用系統(tǒng)也可以與基于在此的示教一起使用。根據(jù)上面的描述,構(gòu)造這類系統(tǒng)所要求的結(jié)構(gòu)是顯而易見的。此外,本發(fā)明也不針對任何特定編程語言。應(yīng)當(dāng)明白,可以利用各種編程語言實(shí)現(xiàn)在此描述的本發(fā)明的內(nèi)容,并且上面對特定語言所做的描述是為了披露本發(fā)明的最佳實(shí)施方式。
[0768]在此處所提供的說明書中,說明了大量具體細(xì)節(jié)。然而,能夠理解,本發(fā)明的實(shí)施例可以在沒有這些具體細(xì)節(jié)的情況下實(shí)踐。在一些實(shí)例中,并未詳細(xì)示出公知的方法、結(jié)構(gòu)和技術(shù),以便不模糊對本說明書的理解。
[0769]類似地,應(yīng)當(dāng)理解,為了精簡本公開并幫助理解各個(gè)發(fā)明方面中的一個(gè)或多個(gè),在上面對本發(fā)明的示例性實(shí)施例的描述中,本發(fā)明的各個(gè)特征有時(shí)被一起分組到單個(gè)實(shí)施例、圖、或者對其的描述中。然而,并不應(yīng)將該公開的方法解釋成反映如下意圖:即所要求保護(hù)的本發(fā)明要求比在每個(gè)權(quán)利要求中所明確記載的特征更多的特征。更確切地說,如下面的權(quán)利要求書所反映的那樣,發(fā)明方面在于少于前面公開的單個(gè)實(shí)施例的所有特征。因此,遵循【具體實(shí)施方式】的權(quán)利要求書由此明確地并入該【具體實(shí)施方式】,其中每個(gè)權(quán)利要求本身都作為本發(fā)明的單獨(dú)實(shí)施例。
[0770]本領(lǐng)域那些技術(shù)人員可以理解,可以對實(shí)施例中的設(shè)備中的模塊進(jìn)行自適應(yīng)性地改變并且把它們設(shè)置在與該實(shí)施例不同的一個(gè)或多個(gè)設(shè)備中??梢园褜?shí)施例中的模塊或單元或組件組合成一個(gè)模塊或單元或組件,以及此外可以把它們分成多個(gè)子模塊或子單元或子組件。除了這樣的特征和/或過程或者單元中的至少一些是相互排斥之外,可以采用任何組合對本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設(shè)備的所有過程或單元進(jìn)行組合。除非另外明確陳述,本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的每個(gè)特征可以由提供相同、等同或相似目的的替代特征來代替。
[0771]此外,本領(lǐng)域的技術(shù)人員能夠理解,盡管在此所述的一些實(shí)施例包括其它實(shí)施例中所包括的某些特征而不是其它特征,但是不同實(shí)施例的特征的組合意味著處于本發(fā)明的范圍之內(nèi)并且形成不同的實(shí)施例。例如,在下面的權(quán)利要求書中,所要求保護(hù)的實(shí)施例的任意之一都可以以任意的組合方式來使用。
[0772]本發(fā)明的各個(gè)部件實(shí)施例可以以硬件實(shí)現(xiàn),或者以在一個(gè)或者多個(gè)處理器上運(yùn)行的軟件模塊實(shí)現(xiàn),或者以它們的組合實(shí)現(xiàn)。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,可以在實(shí)踐中使用微處理器或者數(shù)字信號(hào)處理器(DSP)來實(shí)現(xiàn)根據(jù)本發(fā)明實(shí)施例的基于消息隊(duì)列的共享內(nèi)存寫入、讀取、讀寫方法和系統(tǒng)設(shè)備中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實(shí)現(xiàn)為用于執(zhí)行這里所描述的方法的一部分或者全部的設(shè)備或者裝置程序(例如,計(jì)算機(jī)程序和計(jì)算機(jī)程序產(chǎn)品)。這樣的實(shí)現(xiàn)本發(fā)明的程序可以存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)上,或者可以具有一個(gè)或者多個(gè)信號(hào)的形式。這樣的信號(hào)可以從因特網(wǎng)網(wǎng)站上下載得到,或者在載體信號(hào)上提供,或者以任何其他形式提供。
[0773]應(yīng)該注意的是上述實(shí)施例對本發(fā)明進(jìn)行說明而不是對本發(fā)明進(jìn)行限制,并且本領(lǐng)域技術(shù)人員在不脫離所附權(quán)利要求的范圍的情況下可設(shè)計(jì)出替換實(shí)施例。在權(quán)利要求中,不應(yīng)將位于括號(hào)之間的任何參考符號(hào)構(gòu)造成對權(quán)利要求的限制。單詞“包含”不排除存在未列在權(quán)利要求中的元件或步驟。位于元件之前的單詞“一”或“一個(gè)”不排除存在多個(gè)這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當(dāng)編程的計(jì)算機(jī)來實(shí)現(xiàn)。在列舉了若干裝置的單元權(quán)利要求中,這些裝置中的若干個(gè)可以是通過同一個(gè)硬件項(xiàng)來具體體現(xiàn)。單詞第一、第二、以及第三等的使用不表示任何順序??蓪⑦@些單詞解釋為名稱。
[0774]本發(fā)明公開了 Al、一種基于消息隊(duì)列的共享內(nèi)存寫入方法,所述消息隊(duì)列包括第一消息隊(duì)列,所述方法包括:
[0775]采用所述消息隊(duì)列執(zhí)行多線程進(jìn)隊(duì)push以及單線程出隊(duì)pop的操作;
[0776]將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存;
[0777]其中,所述多線程進(jìn)隊(duì)push的操作包括:
[0778]判斷所述消息隊(duì)列是否已滿;
[0779]若否,則分別計(jì)算n個(gè)線程進(jìn)隊(duì)push的偏移量;所述n為大于或等于I的正整數(shù);
[0780]依據(jù)所述n個(gè)線程進(jìn)隊(duì)push的偏移量,分別計(jì)算所述n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置Pos ;
[0781]所述n個(gè)線程分別在其進(jìn)隊(duì)push的實(shí)際位置Pos執(zhí)行進(jìn)隊(duì)push操作;
[0782]其中,所述將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存的步驟包括:
[0783]獲得所述單線程出隊(duì)pop的數(shù)據(jù)及其長度;
[0784]檢查所述數(shù)據(jù)的長度是否超出共享內(nèi)存的長度界限;
[0785]若否,則獲取所述共享內(nèi)存的讀偏移指針pRead和寫偏移指針pWrite ;
[0786]依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置,并判斷所述數(shù)據(jù)是否可寫;
[0787]若是,則在所述寫入位置寫入所述數(shù)據(jù)。
[0788]A2、根據(jù)權(quán)利要求Al所述的方法,其特征在于,在采用所述消息隊(duì)列執(zhí)行多線程進(jìn)隊(duì)push以及單線程出隊(duì)pop的操作的步驟之前還包括:
[0789]在存在多個(gè)消息隊(duì)列時(shí),選定用于當(dāng)前通信的第一消息隊(duì)列。
[0790]A3、根據(jù)權(quán)利要求A2所述的方法,其特征在于,所述選定用于當(dāng)前通信的第一消息隊(duì)列的步驟包括:
[0791]讀取所述數(shù)據(jù)的協(xié)議中的上下文參數(shù)intnld ;
[0792]采用所述上下文參數(shù)intnld對所述多個(gè)消息隊(duì)列的個(gè)數(shù)取模;
[0793]提取所述取模的值對應(yīng)的消息隊(duì)列為用于當(dāng)前通信的第一消息隊(duì)列。
[0794]A4、根據(jù)權(quán)利要求Al所述的方法,其特征在于,所述判斷消息隊(duì)列是否已滿的子步驟進(jìn)一步包括:
[0795]讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值;
[0796]遞減所述CanWriteCount 的值;
[0797]若獲得遞減后的CanWriteCount的值為0,則判定所述消息隊(duì)列為已滿,否則,判定所述消息隊(duì)列為未滿。
[0798]A5、根據(jù)權(quán)利要求Al所述的方法,其特征在于,所述分別計(jì)算n個(gè)線程進(jìn)隊(duì)push的偏移量的子步驟進(jìn)一步包括:[0799]讀取進(jìn)隊(duì)push的偏移量Pushpos的值;
[0800]針對所述n個(gè)線程迭代增加所述Pushpos的值,分別獲得所述n個(gè)線程進(jìn)隊(duì)push
的偏移量。
[0801]A6、根據(jù)權(quán)利要求Al所述的方法,其特征在于,所述分別計(jì)算所述n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置Pos的子步驟進(jìn)一步包括:
[0802]讀取所述消息隊(duì)列大小參數(shù)Size的值;
[0803]采用所述Size的值對所述Pushpos的值取模,獲得對應(yīng)的n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置Pos。
[0804]A7、根據(jù)權(quán)利要求Al或A4或A5或A6所述的方法,其特征在于,在所述n個(gè)線程分別在其進(jìn)隊(duì)push的實(shí)際位置執(zhí)行進(jìn)隊(duì)push操作的子步驟之后,所述多線程進(jìn)隊(duì)push的操作還包括:
[0805]讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值;
[0806]按照所述n個(gè)線程進(jìn)隊(duì)push的操作,迭代增加所述CanReadCount的值。
[0807]AS、根據(jù)權(quán)利要求Al所述的方法,其特征在于,所述單線程出隊(duì)pop的操作的子步驟為:
[0808]單個(gè)線程依次在所述消息隊(duì)列中執(zhí)行出隊(duì)pop操作。
[0809]A9、根據(jù)權(quán)利要求Al所述的方法,其特征在于,所述多線程進(jìn)隊(duì)push的操作還包括:
[0810]若所述消息隊(duì)列已滿,則禁止執(zhí)行進(jìn)隊(duì)push的操作。
[0811]A10、根據(jù)權(quán)利要求Al所述的方法,其特征在于,所述將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存的步驟還包括:
[0812]若所述數(shù)據(jù)的長度超出共享內(nèi)存的長度界限,則禁止寫入。
[0813]All、根據(jù)權(quán)利要求Al所述的方法,其特征在于,所述依據(jù)所述讀偏移指針pRead和寫偏移指針PWrite,以及,所述數(shù)據(jù)的長度,確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置,并判斷所述數(shù)據(jù)是否可寫的子步驟進(jìn)一步包括:
[0814]依據(jù)所述寫偏移指針pWrite確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置;
[0815]當(dāng)所述讀偏移指針pRead和寫偏移指針pWrite處于同一位置時(shí),判定所述數(shù)據(jù)可與。
[0816]A12、根據(jù)權(quán)利要求All所述的方法,其特征在于,所述依據(jù)所述讀偏移指針pRead和寫偏移指針PWrite,以及,所述數(shù)據(jù)的長度,確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置,并判斷所述數(shù)據(jù)是否可寫的子步驟還進(jìn)一步包括:
[0817]依據(jù)所述寫偏移指針pWrite確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置;
[0818]當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite后面的位置時(shí),設(shè)置可寫數(shù)據(jù)的長度小于或等于allsize-pRead+pWrite-head,其中allsize為共享內(nèi)存的長度,所述head為文件頭的長度;
[0819]判斷所述數(shù)據(jù)的長度是否小于或等于所述可寫數(shù)據(jù)的長度;
[0820]若是,則判定所述數(shù)據(jù)可寫;
[0821 ] 若否,則判定所述數(shù)據(jù)不可寫。
[0822]A13、根據(jù)權(quán)利要求A12所述的方法,其特征在于,所述依據(jù)所述讀偏移指針pRead和寫偏移指針PWrite,以及,所述數(shù)據(jù)的長度,確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置,并判斷所述數(shù)據(jù)是否可寫的子步驟還進(jìn)一步包括:
[0823]依據(jù)所述寫偏移指針pWrite確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置;
[0824]當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),設(shè)置可寫數(shù)據(jù)的長度小于或等于pRead-pWrite ;
[0825]判斷所述數(shù)據(jù)的長度是否小于或等于所述可寫數(shù)據(jù)的長度;
[0826]若是,則判定所述數(shù)據(jù)可寫;
[0827]若否,則判定所述數(shù)據(jù)不可寫。
[0828]A14、根據(jù)權(quán)利要求Al所述的方法,其特征在于,所述獲取所述共享內(nèi)存的讀偏移指針pRead和寫偏移指針pWrite的子步驟進(jìn)一步包括:
[0829]獲得所述共享內(nèi)存的映射文件,所述映射文件包括文件頭;
[0830]從所述文件頭中讀取寫偏移指針pWrite ;
[0831]從所述文件頭中讀取讀偏移指針pRead并快照到臨時(shí)變量中。
[0832]A15、根據(jù)權(quán)利要求Al所述的方法,其特征在于,所述在所述數(shù)據(jù)所在共享內(nèi)存的位置寫入所述數(shù)據(jù)的子步驟進(jìn)一步包括:
[0833]當(dāng)所述讀偏移指針pRead和寫偏移指針pWrite處于同一位置時(shí),或,當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite后面的位置時(shí),則從當(dāng)前寫偏移指針pWrite位置開始寫入所述數(shù)據(jù);
[0834]當(dāng)寫入到所述共享內(nèi)存尾部的位置時(shí),判斷所述數(shù)據(jù)是否已全部寫入;
[0835]若否,則從所述共享內(nèi)存中文件頭結(jié)束的位置開始繼續(xù)寫入所述數(shù)據(jù),直至在所述讀偏移指針PRead位置之前寫入全部的數(shù)據(jù)。
[0836]A16、根據(jù)權(quán)利要求Al所述的方法,其特征在于,所述在所述數(shù)據(jù)所在共享內(nèi)存的位置寫入所述數(shù)據(jù)子步驟進(jìn)一步包括:
[0837]當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),則從當(dāng)前寫偏移指針PWrite位置開始寫入所述數(shù)據(jù);
[0838]在所述讀偏移指針pRead位置之前寫入全部的數(shù)據(jù)。
[0839]A17、根據(jù)權(quán)利要求A13所述的方法,其特征在于,采用內(nèi)存拷貝memcpy的方式寫入所述數(shù)據(jù)。
[0840]本發(fā)明還公開了 B18、一種基于消息隊(duì)列的共享內(nèi)存讀取方法,所述消息隊(duì)列包括第二消息隊(duì)列,所述方法包括:
[0841 ] 從共享內(nèi)存中讀取數(shù)據(jù);
[0842]將讀出的數(shù)據(jù)通過單線程進(jìn)隊(duì)push的操作壓入所述第二消息隊(duì)列,同時(shí),采用所述第二消息隊(duì)列執(zhí)行多線程出隊(duì)pop的操作;
[0843]其中,所述從共享內(nèi)存中讀取數(shù)據(jù)的步驟包括:
[0844]定位待讀取數(shù)據(jù)所在共享內(nèi)存的位置;
[0845]獲得所述待讀取數(shù)據(jù)的長度;
[0846]獲取所述共享內(nèi)存的讀偏移指針pRead和寫偏移指針pWrite ;
[0847]依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述待讀取數(shù)據(jù)的長度,判斷所述待讀取數(shù)據(jù)是否可讀;[0848]若是,則從所述待讀取數(shù)據(jù)所在共享內(nèi)存的位置,讀出所述待讀取數(shù)據(jù);
[0849]其中,所述多線程出隊(duì)pop的操作包括:
[0850]判斷所述消息隊(duì)列是否已空;
[0851]若否,則分別計(jì)算n個(gè)線程出隊(duì)pop的偏移量;所述n為大于或等于I的正整數(shù);
[0852]依據(jù)所述n個(gè)線程出隊(duì)pop的偏移量,分別計(jì)算所述n個(gè)線程出隊(duì)pop的實(shí)際位置 Pos ;
[0853]所述n個(gè)線程分別在其出隊(duì)pop的實(shí)際位置執(zhí)行出隊(duì)pop操作。
[0854]B19、根據(jù)權(quán)利要求B18所述的方法,其特征在于,所述從共享內(nèi)存中讀取數(shù)據(jù)的步驟還包括:
[0855]若所述數(shù)據(jù)不可讀,則返回?cái)?shù)據(jù)為空。
[0856]B20、根據(jù)權(quán)利要求B18或B19所述的方法,其特征在于,所述依據(jù)所述讀偏移指針PRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,判斷所述數(shù)據(jù)是否可讀的子步驟進(jìn)一步包括:
[0857]當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite后面的位置時(shí),設(shè)置可讀數(shù)據(jù)的長度小于或等于pWrite-pRead ;
[0858]判斷所述數(shù)據(jù)的長度是否小于或等于所述可讀數(shù)據(jù)的長度;
[0859]若是,則判定所述數(shù)據(jù)可讀;
[0860]若否,則判定所述數(shù)據(jù)不可讀。
[0861]B21、根據(jù)權(quán)利要求B20所述的方法,其特征在于,所述依據(jù)所述讀偏移指針pRead和寫偏移指針PWrite,以及,所述數(shù)據(jù)的長度,判斷所述數(shù)據(jù)是否可讀的子步驟還進(jìn)一步包括:
[0862]當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),設(shè)置可讀數(shù)據(jù)的長度小于或等于allsize-pRead+pWrite-head,其中,所述allsize為共享內(nèi)存的長度,所述head為文件頭的長度;
[0863]判斷所述數(shù)據(jù)的長度是否小于或等于所述可讀數(shù)據(jù)的長度;
[0864]若是,則判定所述數(shù)據(jù)可讀;
[0865]若否,則判定所述數(shù)據(jù)不可讀。
[0866]B22、根據(jù)權(quán)利要求B21所述的方法,其特征在于,所述依據(jù)所述讀偏移指針pRead和寫偏移指針PWrite,以及,所述數(shù)據(jù)的長度,判斷所述數(shù)據(jù)是否可讀的子步驟還進(jìn)一步包括:
[0867]當(dāng)所述讀偏移指針pRead和寫偏移指針pWrite處于同一位置時(shí),則判定所述數(shù)據(jù)不可讀。
[0868]B23、根據(jù)權(quán)利要求B18所述的方法,其特征在于,所述獲取所述共享內(nèi)存的讀偏移指針pRead和寫偏移指針pWrite的子步驟進(jìn)一步包括:
[0869]獲得所述共享內(nèi)存的映射文件,所述映射文件包括文件頭;
[0870]從所述文件頭中讀取讀偏移指針pRead ;
[0871]從所述文件頭中讀取寫偏移指針pWrite并快照到臨時(shí)變量中。
[0872]B24、根據(jù)權(quán)利要求B20所述的方法,其特征在于,所述從所述數(shù)據(jù)所在共享內(nèi)存的位置,讀出所述數(shù)據(jù)的子步驟進(jìn)一步包括:[0873]當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite后面的位置時(shí),則從當(dāng)前讀偏移指針PRead位置開始讀出所述數(shù)據(jù);
[0874]在不超過所述寫偏移指針pWrite位置讀出全部的數(shù)據(jù)。
[0875]B25、根據(jù)權(quán)利要求B21所述的方法,其特征在于,所述從所述數(shù)據(jù)所在共享內(nèi)存的位置,讀出所述數(shù)據(jù)的子步驟進(jìn)一步包括:
[0876]當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),則從當(dāng)前讀偏移指針PRead位置開始讀出所述數(shù)據(jù);
[0877]當(dāng)讀取至所述共享內(nèi)存尾部的位置時(shí),判斷所述數(shù)據(jù)是否已全部讀出;
[0878]若否,則從所述共享內(nèi)存中文件頭結(jié)束的位置開始繼續(xù)讀出所述數(shù)據(jù),直至在不超過所述寫偏移指針PWrite位置讀出全部的數(shù)據(jù)。
[0879]B26、根據(jù)權(quán)利要求B25所述的方法,其特征在于,采用內(nèi)存拷貝memcpy的方式讀出所述數(shù)據(jù)。
[0880]B27、根據(jù)權(quán)利要求B18所述的方法,其特征在于,所述判斷消息隊(duì)列是否已空的
子步驟進(jìn)一步包括:
[0881]讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值;
[0882]遞減所述CanReadCount 的值;
[0883]若獲得遞減后的CanReadCount的值為0,則判定所述消息隊(duì)列為已空,否則,判定所述消息隊(duì)列為未空。
[0884]B28、根據(jù)權(quán)利要求B18所述的方法,其特征在于,所述分別計(jì)算n個(gè)線程出隊(duì)pop的偏移量的子步驟進(jìn)一步包括:
[0885]讀取出隊(duì)pop的偏移量Poppos的值;
[0886]針對所述n個(gè)線程迭代增加所述Poppos的值,分別獲得所述n個(gè)線程出隊(duì)pop的
偏移量。
[0887]B29、根據(jù)權(quán)利要求B18所述的方法,其特征在于,所述分別計(jì)算所述n個(gè)線程出隊(duì)pop的實(shí)際位置Pos的子步驟還進(jìn)一步包括:
[0888]讀取所述消息隊(duì)列大小參數(shù)Size的值;
[0889]采用所述Size的值對所述Poppos的值取模,獲得對應(yīng)的n個(gè)線程出隊(duì)pop的實(shí)際位置Pos。
[0890]B30、根據(jù)權(quán)利要求B18或B27或B28或B29所述的方法,其特征在于,在所述n個(gè)線程分別在其出隊(duì)pop的實(shí)際位置執(zhí)行出隊(duì)pop操作的步驟之后,還包括:
[0891]讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值;
[0892]按照所述n個(gè)線程出隊(duì)pop的操作,迭代增加所述CanWriteCount的值。
[0893]B31、根據(jù)權(quán)利要求B18所述的方法,其特征在于,所述單線程進(jìn)隊(duì)push的操作進(jìn)一步包括:
[0894]單個(gè)線程依次在所述消息隊(duì)列中執(zhí)行進(jìn)隊(duì)push操作。
[0895]B32、根據(jù)權(quán)利要求B18所述的方法,其特征在于,所述多線程出隊(duì)pop的操作還進(jìn)一步包括:
[0896]若所述消息隊(duì)列已空,則禁止執(zhí)行出隊(duì)pop的操作。
[0897]本發(fā)明還公開了 C33、一種基于消息隊(duì)列的共享內(nèi)存處理的方法,所述消息隊(duì)列包括第一消息隊(duì)列和第二消息隊(duì)列,所述方法包括:
[0898]采用第一消息隊(duì)列執(zhí)行多線程進(jìn)隊(duì)push以及單線程出隊(duì)pop的操作;
[0899]將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存;
[0900]從所述共享內(nèi)存中讀取數(shù)據(jù);
[0901]將讀出的數(shù)據(jù)通過單線程進(jìn)隊(duì)push的操作壓入所述第二消息隊(duì)列,同時(shí),采用所述第二消息隊(duì)列執(zhí)行多線程出隊(duì)pop的操作;
[0902]其中,所述多線程進(jìn)隊(duì)push的操作包括:
[0903]讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值;
[0904]遞減所述CanWriteCount 的值;
[0905]若獲得遞減后的CanWriteCount的值不為0,則判定所述消息隊(duì)列為未滿;
[0906]在所述消息隊(duì)列未滿時(shí),分別計(jì)算n個(gè)線程進(jìn)隊(duì)push的偏移量;所述n為大于或等于I的正整數(shù);
[0907]依據(jù)所述n個(gè)線程進(jìn)隊(duì)push的偏移量,分別計(jì)算所述n個(gè)線程進(jìn)隊(duì)push的實(shí)際
位置;
[0908]所述n個(gè)線程分別在其進(jìn)隊(duì)push的實(shí)際位置執(zhí)行進(jìn)隊(duì)push操作;
[0909]讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值;
[0910]按照所述n個(gè)線程進(jìn)隊(duì)push的操作,迭代增加所述CanReadCount的值;
[0911]其中,所述多線程出隊(duì)pop的操作包括:
[0912]讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值;
[0913]遞減所述CanReadCount 的值;
[0914]若獲得遞減后的CanReadCount的值不為0,則判定所述消息隊(duì)列為未空;
[0915]在所述消息隊(duì)列未空時(shí),分別計(jì)算n個(gè)線程出隊(duì)pop的偏移量;所述n為大于或等于I的正整數(shù);
[0916]依據(jù)所述n個(gè)線程出隊(duì)pop的偏移量,分別計(jì)算所述n個(gè)線程出隊(duì)pop的實(shí)際位置;
[0917]所述n個(gè)線程分別在其出隊(duì)pop的實(shí)際位置執(zhí)行出隊(duì)pop操作;
[0918]讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值;
[0919]按照所述n個(gè)線程出隊(duì)pop的操作,迭代增加所述CanWriteCount的值。
[0920]其中,將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存的步驟包括:
[0921]獲得所述單線程出隊(duì)pop的數(shù)據(jù)及其長度;
[0922]檢查所述數(shù)據(jù)的長度是否超出共享內(nèi)存的長度界限;
[0923]若否,則獲取所述共享內(nèi)存的讀偏移指針pRead和寫偏移指針pWrite ;
[0924]依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置,并判斷所述數(shù)據(jù)是否可寫;
[0925]若是,則在所述寫入位置寫入所述數(shù)據(jù);
[0926]其中,所述從共享內(nèi)存中讀取數(shù)據(jù)的步驟包括:
[0927]定位待讀取數(shù)據(jù)所在共享內(nèi)存的位置;
[0928]獲得所述待讀取數(shù)據(jù)的長度;
[0929]獲取所述共享內(nèi)存的讀偏移指針pRead和寫偏移指針pWrite ;[0930]依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述待讀取數(shù)據(jù)的長度,判斷所述待讀取數(shù)據(jù)是否可讀;
[0931]若是,則從所述待讀取數(shù)據(jù)所在共享內(nèi)存的位置,讀出所述待讀取數(shù)據(jù)。
[0932]本發(fā)明還公開了 D34、一種基于消息隊(duì)列的共享內(nèi)存寫入系統(tǒng),所述消息隊(duì)列包括第一消息隊(duì)列,所述系統(tǒng)包括:
[0933]多線程進(jìn)隊(duì)push模塊及單線程出隊(duì)pop模塊,用于采用所述消息隊(duì)列執(zhí)行多線程進(jìn)隊(duì)push以及單線程出隊(duì)pop的操作;
[0934]數(shù)據(jù)寫入模塊,用于將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存;
[0935]其中,所述多線程進(jìn)隊(duì)push模塊包括:
[0936]第一判斷子模塊,用于判斷所述消息隊(duì)列是否已滿;
[0937]進(jìn)隊(duì)push偏移量計(jì)算子模塊,用于在消息隊(duì)列未滿時(shí),分別計(jì)算n個(gè)線程進(jìn)隊(duì)push的偏移量;所述n為大于或等于I的正整數(shù);
[0938]進(jìn)隊(duì)push的實(shí)際位置Pos計(jì)算子模塊,用于依據(jù)所述n個(gè)線程進(jìn)隊(duì)push的偏移量,分別計(jì)算所述n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置Pos ;
[0939]操作進(jìn)隊(duì)push子模塊,用于所述n個(gè)線程分別在其進(jìn)隊(duì)push的實(shí)際位置Pos執(zhí)行進(jìn)隊(duì)push操作;
[0940]其中,所述數(shù)據(jù)寫入模塊包括:
[0941]數(shù)據(jù)及其長度獲得子模塊,用于獲得所述單線程出隊(duì)pop的數(shù)據(jù)及其長度;
[0942]界限檢查模塊,用于檢查所述數(shù)據(jù)的長度是否超出共享內(nèi)存的長度界限;
[0943]第一指針獲取子模塊,用于在所述數(shù)據(jù)的長度未超出共享內(nèi)存的長度界限時(shí),獲取所述共享內(nèi)存的讀偏移指針PRead和寫偏移指針pWrite ;
[0944]可寫判斷子模塊,用于依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置,并判斷所述數(shù)據(jù)是否可寫;
[0945]寫入子模塊,用于在數(shù)據(jù)可寫時(shí),在所述寫入位置寫入所述數(shù)據(jù)。
[0946]D35、根據(jù)權(quán)利要求D34所述的系統(tǒng),其特征在于,還包括:
[0947]第一消息隊(duì)列選定模塊,用于在存在多個(gè)消息隊(duì)列時(shí),選定用于當(dāng)前通信的第一消息隊(duì)列。
[0948]D36、根據(jù)權(quán)利要求D35所述的系統(tǒng),其特征在于,所述第一消息隊(duì)列選定模塊包括:
[0949]上下文參數(shù)讀取子模塊,用于讀取所述數(shù)據(jù)的協(xié)議中的上下文參數(shù)intnld ;
[0950]取模子模塊,用于采用所述上下文參數(shù)intnld對所述多個(gè)消息隊(duì)列的個(gè)數(shù)取模;
[0951]提取子模塊,用于提取所述取模的值對應(yīng)的消息隊(duì)列為用于當(dāng)前通信的第一消息隊(duì)列。
[0952]D37、根據(jù)權(quán)利要求D34所述的系統(tǒng),其特征在于,所述第一判斷子模塊進(jìn)一步包括:
[0953]可寫計(jì)數(shù)參數(shù)讀取子模塊,用于讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值;
[0954]可寫計(jì)數(shù)參數(shù)遞減子模塊,用于遞減所述CanWriteCount的值;
[0955]第一判斷子模塊,用于在獲得遞減后的CanWriteCount的值為0,則判定所述消息隊(duì)列為已滿,否則,判定所述消息隊(duì)列為未滿。[0956]D38、根據(jù)權(quán)利要求D34所述的系統(tǒng),其特征在于,所述進(jìn)隊(duì)push偏移量計(jì)算子模塊進(jìn)一步包括:
[0957]偏移量Pushpos讀取子模塊,用于讀取進(jìn)隊(duì)push的偏移量Pushpos的值;
[0958]偏移量Pushpos獲得子模塊,用于針對所述n個(gè)線程迭代增加所述Pushpos的值,分別獲得所述n個(gè)線程進(jìn)隊(duì)push的偏移量。
[0959]D39、根據(jù)權(quán)利要求D34所述的系統(tǒng),其特征在于,所述進(jìn)隊(duì)push的實(shí)際位置Pos計(jì)算子模塊進(jìn)一步包括:
[0960]第一大小參數(shù)Size讀取子模塊,用于讀取所述消息隊(duì)列大小參數(shù)Size的值;
[0961]進(jìn)隊(duì)push的實(shí)際位置Pos獲得子模塊,用于獲得對應(yīng)的n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置Pos。
[0962]D40、根據(jù)權(quán)利要求D34或D37或D38或D39所述的系統(tǒng),所述多線程進(jìn)隊(duì)push子模塊還進(jìn)一步包括:
[0963]可讀計(jì)數(shù)參數(shù)讀取子模塊,讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值;
[0964]可讀計(jì)數(shù)參數(shù)讀迭代增加子模塊,按照所述n個(gè)線程進(jìn)隊(duì)push的操作,迭代增加所述 CanReadCount 的值。
[0965]D41、根據(jù)權(quán)利要求D34所述的系統(tǒng),其特征在于,所述單線程出隊(duì)pop模塊進(jìn)一步包括:
[0966]出隊(duì)pop子模塊,用于單個(gè)線程依次在所述消息隊(duì)列中執(zhí)行出隊(duì)pop操作。
[0967]D42、根據(jù)權(quán)利要求D34所述的系統(tǒng),其特征在于,所述多線程進(jìn)隊(duì)push模塊還進(jìn)一步包括:
[0968]進(jìn)隊(duì)push的操作禁止子模塊,用于在所述消息隊(duì)列已滿時(shí),禁止執(zhí)行進(jìn)隊(duì)push的操作。
[0969]D43、根據(jù)權(quán)利要求D34所述的系統(tǒng),其特征在于,所述數(shù)據(jù)寫入模塊還進(jìn)一步包括:
[0970]禁止寫入子模塊,用于在所述數(shù)據(jù)的長度超出共享內(nèi)存的長度界限,則禁止寫入。[0971 ] D44、根據(jù)權(quán)利要求D34或D43所述的系統(tǒng),其特征在于,所述可寫判斷子模塊進(jìn)一步包括:
[0972]第一寫入位置確定子模塊,用于依據(jù)所述寫偏移指針pWrite確定所述數(shù)據(jù)在共孕內(nèi)存中的與入位置;
[0973]第一可寫判定子模塊,用于當(dāng)所述讀偏移指針pRead和寫偏移指針pWrite處于同一位置時(shí),判定所述數(shù)據(jù)可寫。
[0974]D45、根據(jù)權(quán)利要求D44所述的系統(tǒng),其特征在于,所述可寫判斷子模塊還進(jìn)一步包括:
[0975]第二寫入位置確定子模塊,用于依據(jù)所述寫偏移指針pWrite確定所述數(shù)據(jù)在共孕內(nèi)存中的與入位置;
[0976]第一可寫數(shù)據(jù)長度設(shè)置子模塊,用于在所述讀偏移指針pRead處于所述寫偏移指針pWrite后面的位置時(shí),設(shè)置可寫數(shù)據(jù)的長度小于或等于allsize-pWrite+pRead-head,其中allsize為共享內(nèi)存的長度,所述head為文件頭的長度;
[0977]第三判斷子模塊,用于判斷所述數(shù)據(jù)的長度是否小于或等于所述可寫數(shù)據(jù)的長度;
[0978]第二可寫判定子模塊,用于所述數(shù)據(jù)的長度小于或等于所述可寫數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)可寫;
[0979]第一不可寫判定子模塊,用于所述數(shù)據(jù)的長度大于所述可寫數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)不可寫。
[0980]D46、根據(jù)權(quán)利要求D45所述的系統(tǒng),其特征在于,所述可寫判斷子模塊還進(jìn)一步包括:
[0981]第三寫入位置確定子模塊,用于依據(jù)所述寫偏移指針pWrite確定所述數(shù)據(jù)在共孕內(nèi)存中的與入位置;
[0982]第二可寫數(shù)據(jù)長度設(shè)置子模塊,用于在所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),設(shè)置可寫數(shù)據(jù)的長度小于或等于pRead-pWrite ;
[0983]第四判斷子模塊,用于判斷所述數(shù)據(jù)的長度是否小于或等于所述可寫數(shù)據(jù)的長度;
[0984]第三可寫判定子模塊,用于所述數(shù)據(jù)的長度小于或等于所述可寫數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)可寫;
[0985]第二不可寫判定子模塊,用于所述數(shù)據(jù)的長度大于所述可寫數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)不可寫。
[0986]D47、根據(jù)權(quán)利要求D34或D44或D45或D46所述的系統(tǒng),其特征在于,所述第一指針獲取子模塊進(jìn)一步包括:
[0987]第一映射文件獲得子模塊,用于獲得所述共享內(nèi)存的映射文件,所述映射文件包括文件頭;
[0988]第一寫偏移指針pWrite讀取子模塊,用于從所述文件頭中讀取寫偏移指針pWrite ;
[0989]第一讀偏移指針pRead讀取子模塊,用于從所述文件頭中讀取讀偏移指針pRead并快照到臨時(shí)變量中。
[0990]D48、根據(jù)權(quán)利要求D44或D45所述的系統(tǒng),其特征在于,所述寫入子模塊進(jìn)一步包括:
[0991 ] 第一開始寫入子模塊,用于在所述讀偏移指針pRead和寫偏移指針pWrite處于同一位置時(shí),或,在所述讀偏移指針PRead處于所述寫偏移指針pWrite后面的位置時(shí),則從當(dāng)前寫偏移指針PWrite位置開始寫入所述數(shù)據(jù);
[0992]尾部寫入判斷子模塊,用于在寫入到所述共享內(nèi)存尾部的位置時(shí),判斷所述數(shù)據(jù)是否已全部寫入;
[0993]第一全部寫入子模塊,用于所述數(shù)據(jù)未全部寫入時(shí),從所述共享內(nèi)存中文件頭結(jié)束的位置開始繼續(xù)寫入所述數(shù)據(jù),直至在所述讀偏移指針PRead位置之前寫入全部的數(shù)據(jù)。
[0994]D49、根據(jù)權(quán)利要求D46所述的系統(tǒng),其特征在于,所述寫入子模塊進(jìn)一步包括:
[0995]第二開始寫入子模塊,用于在所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),則從當(dāng)前寫偏移指針PWrite位置開始寫入所述數(shù)據(jù);
[0996]第二全部寫入子模塊,用于在所述讀偏移指針pRead位置之前寫入全部的數(shù)據(jù)。[0997]D50、根據(jù)權(quán)利要求D34所述的系統(tǒng),其特征在于,采用內(nèi)存拷貝memcpy的方式寫入所述數(shù)據(jù)
[0998]本發(fā)明還公開了 E51、一種基于消息隊(duì)列的共享內(nèi)存讀取系統(tǒng),所述消息隊(duì)列包括第二消息隊(duì)列,所述系統(tǒng)包括:
[0999]數(shù)據(jù)讀取模塊,用于從共享內(nèi)存中讀取數(shù)據(jù);
[1000]單線程進(jìn)隊(duì)push模塊及多線程出隊(duì)pop模塊,用于將讀出的數(shù)據(jù)通過單線程進(jìn)隊(duì)push的操作壓入所述第二消息隊(duì)列,同時(shí),采用所述第二消息隊(duì)列執(zhí)行多線程出隊(duì)pop的操作;
[1001]其中,所述數(shù)據(jù)讀取模塊包括:
[1002]定位子模塊,用于定位待讀取數(shù)據(jù)所在共享內(nèi)存的位置;
[1003]數(shù)據(jù)長度獲得子模塊,用于獲得所述待讀取數(shù)據(jù)的長度;
[1004]第二指針獲取子模塊,用于獲取所述共享內(nèi)存的讀偏移指針pRead和寫偏移指針pWrite ;
[1005]可讀判斷子模塊,用于依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,判斷所述待讀取數(shù)據(jù)是否可讀;
[1006]讀取子模塊,用于在所述數(shù)據(jù)可讀時(shí),從所述數(shù)據(jù)所在共享內(nèi)存的位置,讀出所述待讀取數(shù)據(jù)。
[1007]其中,所述多線程出隊(duì)pop模塊包括:
[1008]第二判斷子模塊,用于判斷所述消息隊(duì)列是否已空;
[1009]出隊(duì)pop的偏移量計(jì)算子模塊,用于在消息隊(duì)列未空時(shí),分別計(jì)算n個(gè)線程出隊(duì)pop的偏移量;所述n為大于或等于I的正整數(shù);
[1010]出隊(duì)pop的實(shí)際位置Pos計(jì)算子模塊,用于依據(jù)所述n個(gè)線程出隊(duì)pop的偏移量,分別計(jì)算所述n個(gè)線程出隊(duì)pop的實(shí)際位置Pos ;
[1011]操作出隊(duì)pop子模塊,用于所述n個(gè)線程分別在其出隊(duì)pop的實(shí)際位置執(zhí)行出隊(duì)pop操作。
[1012]E52、根據(jù)權(quán)利要求E51所述的系統(tǒng),其特征在于,所述數(shù)據(jù)讀取模塊還進(jìn)一步包括:
[1013]返回子模塊,用于在所述數(shù)據(jù)不可讀時(shí),返回?cái)?shù)據(jù)為空。
[1014]E53、根據(jù)權(quán)利要求E51或E52所述的系統(tǒng),其特征在于,所述可讀判斷子模塊進(jìn)一步包括:
[1015]第一可讀數(shù)據(jù)長度設(shè)置子模塊,用于在所述讀偏移指針pRead處于所述寫偏移指針pWrite后面的位置時(shí),設(shè)置可讀數(shù)據(jù)的長度小于或等于pWrite-pRead ;
[1016]第一判斷子模塊,用于判斷所述數(shù)據(jù)的長度是否小于或等于所述可讀數(shù)據(jù)的長度;
[1017]第一可讀判定子模塊,用于所述數(shù)據(jù)的長度小于或等于所述可讀數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)可讀;
[1018]第一不可讀判定子模塊,用于所述數(shù)據(jù)的長度大于所述可讀數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)不可讀。
[1019]E54、根據(jù)權(quán)利要求E53所述的系統(tǒng),其特征在于,所述可讀判斷子模塊還進(jìn)一步包括:
[1020]第二可讀數(shù)據(jù)長度設(shè)置子模塊,用于當(dāng)所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),設(shè)置可讀數(shù)據(jù)的長度小于或等于allsize-pRead+pWrite-head,其中,所述allsize為共享內(nèi)存的長度,所述head為文件頭的長度;
[1021]第二判斷子模塊,用于判斷所述數(shù)據(jù)的長度是否小于或等于所述可讀數(shù)據(jù)的長度;
[1022]第二可讀判定子模塊,用于所述數(shù)據(jù)的長度小于或等于所述可讀數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)可讀;
[1023]第二不可讀判定子模塊,用于所述數(shù)據(jù)的長度大于所述可讀數(shù)據(jù)的長度時(shí),判定所述數(shù)據(jù)不可讀。
[1024]E55、根據(jù)權(quán)利要求E53所述的系統(tǒng),其特征在于,所述可讀判斷子模塊還進(jìn)一步包括:
[1025]第三不可讀判定子模塊,用于在所述讀偏移指針pRead和寫偏移指針pWrite處于同一位置時(shí),判定所述數(shù)據(jù)不可讀。
[1026]E56、根據(jù)權(quán)利要求E51或E53或E54或E55所述的系統(tǒng),其特征在于,所述第二指針獲取子模塊進(jìn)一步包括:
[1027]第二映射文件獲得子模塊,用于獲得所述共享內(nèi)存的映射文件,所述映射文件包括文件頭;
[1028]第二讀偏移指針pRead讀取子模塊,用于從所述文件頭中讀取讀偏移指針pRead ;
[1029]第二寫偏移指針pWrite讀取子模塊,用于從所述文件頭中讀取寫偏移指針pWrite并快照到臨時(shí)變量中。
[1030]E57、根據(jù)權(quán)利要求E53所述的系統(tǒng),其特征在于,所述讀取子模塊進(jìn)一步包括:
[1031]第一開始讀取子模塊,用于在所述讀偏移指針pRead處于所述寫偏移指針pWrite后面的位置時(shí),從當(dāng)前讀偏移指針PRead位置開始讀出所述數(shù)據(jù);
[1032]第一全部讀取子模塊,用于在不超過所述寫偏移指針pWrite位置讀出全部的數(shù)據(jù)。
[1033]E58、根據(jù)權(quán)利要求E54所述的方法,其特征在于,所述讀取模塊進(jìn)一步包括:
[1034]第二開始讀取子模塊,用于在所述讀偏移指針pRead處于所述寫偏移指針pWrite前面的位置時(shí),從當(dāng)前讀偏移指針PRead位置開始讀出所述數(shù)據(jù);
[1035]尾部讀取判斷子模塊,用于在讀取至所述共享內(nèi)存尾部的位置時(shí),判斷所述數(shù)據(jù)是否已全部讀出;
[1036]第二全部讀取子模塊,用于在所述數(shù)據(jù)未全部讀出時(shí),從所述共享內(nèi)存中文件頭結(jié)束的位置開始繼續(xù)讀出所述數(shù)據(jù),直至在不超過所述寫偏移指針PWrite位置讀出全部的數(shù)據(jù)。
[1037]E59、根據(jù)權(quán)利要求E51所述的系統(tǒng),其特征在于,采用內(nèi)存拷貝memcpy的方式讀出所述數(shù)據(jù)。
[1038]E60、根據(jù)權(quán)利要求E51所述的系統(tǒng),其特征在于,所述第二判斷子模塊進(jìn)一步包括:
[1039]可讀計(jì)數(shù)參數(shù)讀取子模塊,用于讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值;[1040]可讀計(jì)數(shù)參數(shù)遞減子模塊,用于遞減所述CanReadCount的值;
[1041]第二判斷子模塊,用于在獲得遞減后的CanReadCount的值為0,則判定所述消息隊(duì)列為已空,否則,判定所述消息隊(duì)列為未空。
[1042]E61、根據(jù)權(quán)利要求E51所述的系統(tǒng),其特征在于,所述出隊(duì)pop的偏移量計(jì)算子模塊還進(jìn)一步包括:
[1043]偏移量Poppos讀取子模塊,用于讀取出隊(duì)pop的偏移量Poppos的值;
[1044]偏移量Poppos獲得子模塊,用于針對所述n個(gè)線程迭代增加所述Poppos的值,分別獲得所述n個(gè)線程出隊(duì)pop的偏移量。
[1045]E62、根據(jù)權(quán)利要求E51所述的系統(tǒng),其特征在于,所述出隊(duì)pop的實(shí)際位置Pos計(jì)算子模塊進(jìn)一步包括:
[1046]第二大小參數(shù)讀取子模塊,用于讀取所述消息隊(duì)列大小參數(shù)Size的值;
[1047]出隊(duì)pop的實(shí)際位置Pos計(jì)算子模塊,用于采用所述Size的值對所述Poppos的值取模,獲得對應(yīng)的n個(gè)線程出隊(duì)pop的實(shí)際位置Pos。
[1048]E63、根據(jù)權(quán)利要求E51或E60或E61或E62所述的系統(tǒng),所述多線程出隊(duì)pop模塊還進(jìn)一步包括:
[1049]可寫計(jì)數(shù)參數(shù)讀取子模塊,用于讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值;
[1050]可寫計(jì)數(shù)參數(shù)迭代增加子模塊,用于按照所述n個(gè)線程出隊(duì)pop的操作,迭代增加所述 CanWriteCount 的值。
[1051]E64、根據(jù)權(quán)利要求E51所述的系統(tǒng),其特征在于,所述單線程進(jìn)隊(duì)push模塊進(jìn)一步包括:
[1052]進(jìn)隊(duì)push子模塊,用于單個(gè)線程依次在所述消息隊(duì)列中執(zhí)行進(jìn)隊(duì)push操作。
[1053]E65、根據(jù)權(quán)利要求E51所述的系統(tǒng),其特征在于,所述多線程出隊(duì)pop模塊還進(jìn)一步包括:
[1054]出隊(duì)pop的操作禁止子模塊,用于在所述消息隊(duì)列已空時(shí),則禁止執(zhí)行出隊(duì)pop的操作。
[1055]本發(fā)明還公開了 F66、一種基于消息隊(duì)列的共享內(nèi)存處理的系統(tǒng),所述消息隊(duì)列包括第一消息隊(duì)列和第二消息隊(duì)列,所述方法包括:
[1056]第一進(jìn)隊(duì)push模塊和第一出隊(duì)pop模塊,用于采用第一消息隊(duì)列執(zhí)行多線程進(jìn)隊(duì)push以及單線程出隊(duì)pop的操作;
[1057]共享內(nèi)存寫入模塊,用于將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存;
[1058]共享內(nèi)存讀取模塊,用于從所述共享內(nèi)存中讀取數(shù)據(jù);
[1059]第二進(jìn)隊(duì)push模塊和第二出隊(duì)pop模塊,用于將所述數(shù)據(jù)采用第二消息隊(duì)列執(zhí)行單線程進(jìn)隊(duì)push以及多線程出隊(duì)pop的操作;
[1060]其中,所述第一進(jìn)隊(duì)push模塊包括:
[1061]CanffriteCount參數(shù)讀取子模塊,用于讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值;
[1062]CanffriteCount參數(shù)遞減子模塊,用于遞減所述CanWriteCount的值;
[1063]第三判斷子模塊,用于在獲得遞減后的CanWriteCount的值不為0,則判定所述消息隊(duì)列為未滿;
[1064]push的偏移量計(jì)算子模塊,用于在所述消息隊(duì)列未滿時(shí),分別計(jì)算n個(gè)線程進(jìn)隊(duì)push的偏移量;所述n為大于或等于I的正整數(shù);
[1065]push的實(shí)際位置計(jì)算子模塊,用于依據(jù)所述n個(gè)線程進(jìn)隊(duì)push的偏移量,分別計(jì)算所述n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置;
[1066]push操作執(zhí)行子模塊,用于所述n個(gè)線程分別在其進(jìn)隊(duì)push的實(shí)際位置執(zhí)行進(jìn)隊(duì)push操作;
[1067]CanReadCount參數(shù)讀取子模塊,用于讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值;
[1068]CanReadCount參數(shù)迭加子模塊,用于按照所述n個(gè)線程進(jìn)隊(duì)push的操作,迭代增加所述CanReadCount的值;
[1069]其中,所述第二出隊(duì)pop模塊包括:
[1070]CanReadCount參數(shù)讀取子模塊,用于讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值;
[1071]CanReadCount參數(shù)遞減子模塊,用于遞減所述CanReadCount的值;
[1072]第四判斷子模塊,用于在獲得遞減后的CanReadCount的值不為0,則判定所述消息隊(duì)列為未空;
[1073]pop的偏移量計(jì)算子模塊,用于在所述消息隊(duì)列未空時(shí),分別計(jì)算n個(gè)線程出隊(duì)pop的偏移量;所述n為大于或等于I的正整數(shù);
[1074]pop的實(shí)際位置計(jì)算子模塊,用于依據(jù)所述n個(gè)線程出隊(duì)pop的偏移量,分別計(jì)算所述n個(gè)線程出隊(duì)pop的實(shí)際位置;
[1075]pop操作執(zhí)行子模塊,用于所述n個(gè)線程分別在其出隊(duì)pop的實(shí)際位置執(zhí)行出隊(duì)pop操作;
[1076]CanffriteCount參數(shù)讀取子模塊,用于讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值;
[1077]CanffriteCount參數(shù)迭加子模塊,用于按照所述n個(gè)線程出隊(duì)pop的操作,迭代增加所述CanWriteCount的值;
[1078]其中,共享內(nèi)存寫入模塊包括:
[1079]數(shù)據(jù)獲得子模塊,用于獲得所述單線程出隊(duì)pop的數(shù)據(jù)及其長度;
[1080]檢查子模塊,用于檢查所述數(shù)據(jù)的長度是否超出共享內(nèi)存的長度界限;
[1081]第三指針獲取子模塊,用于在所述數(shù)據(jù)的長度未超出共享內(nèi)存的長度界限時(shí),獲取所述共享內(nèi)存的讀偏移指針PRead和寫偏移指針pWrite ;
[1082]數(shù)據(jù)可寫判斷子模塊,用于依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置,并判斷所述數(shù)據(jù)是否可寫;
[1083]寫入數(shù)據(jù)子模塊,用于在數(shù)據(jù)可寫時(shí),在所述寫入位置寫入所述數(shù)據(jù);
[1084]其中,所述共享內(nèi)存讀取模塊包括:
[1085]數(shù)據(jù)定位子模塊,用于定位待讀取數(shù)據(jù)所在共享內(nèi)存的位置;
[1086]長度獲得子模塊,用于獲得所述待讀取數(shù)據(jù)的長度;
[1087]第四指針獲取子模塊,用于獲取所述共享內(nèi)存的讀偏移指針pRead和寫偏移指針pWrite ;
[1088]數(shù)據(jù)可讀判斷子模塊,用于依據(jù)所述讀偏移指針pRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,判斷所述待讀取數(shù)據(jù)是否可讀;
[1089]讀取數(shù)據(jù)子模塊,用于在所述數(shù)據(jù)可讀時(shí),從所述數(shù)據(jù)所在共享內(nèi)存的位置,讀出所述待讀取數(shù)據(jù)。
【權(quán)利要求】
1.一種基于消息隊(duì)列的共享內(nèi)存寫入方法,所述消息隊(duì)列包括第一消息隊(duì)列,所述方法包括: 采用所述消息隊(duì)列執(zhí)行多線程進(jìn)隊(duì)push以及單線程出隊(duì)pop的操作; 將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存; 其中,所述多線程進(jìn)隊(duì)push的操作包括: 判斷所述消息隊(duì)列是否已滿; 若否,則分別計(jì)算n個(gè)線程進(jìn)隊(duì)push的偏移量;所述n為大于或等于I的正整數(shù); 依據(jù)所述n個(gè)線程進(jìn)隊(duì)push的偏移量,分別計(jì)算所述n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置Pos ; 所述n個(gè)線程分別在其進(jìn)隊(duì)push的實(shí)際位置Pos執(zhí)行進(jìn)隊(duì)push操作; 其中,所述將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存的步驟包括: 獲得所述單線程出隊(duì)pop的數(shù)據(jù)及其長度; 檢查所述數(shù)據(jù)的長度是否 超出共享內(nèi)存的長度界限; 若否,則獲取所述共享內(nèi)存的讀偏移指針PRead和寫偏移指針pWrite ; 依據(jù)所述讀偏移指針PRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置,并判斷所述數(shù)據(jù)是否可寫; 若是,則在所述寫入位置寫入所述數(shù)據(jù)。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述判斷消息隊(duì)列是否已滿的子步驟進(jìn)一步包括: 讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值; 遞減所述CanWriteCount的值; 若獲得遞減后的CanWriteCount的值為0,則判定所述消息隊(duì)列為已滿,否則,判定所述消息隊(duì)列為未滿。
3.根據(jù)權(quán)利要求1或2所述的方法,其特征在于,在所述n個(gè)線程分別在其進(jìn)隊(duì)push的實(shí)際位置執(zhí)行進(jìn)隊(duì)push操作的子步驟之后,所述多線程進(jìn)隊(duì)push的操作還包括: 讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值; 按照所述n個(gè)線程進(jìn)隊(duì)push的操作,迭代增加所述CanReadCount的值。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述獲取所述共享內(nèi)存的讀偏移指針pRead和寫偏移指針pWrite的子步驟進(jìn)一步包括: 獲得所述共享內(nèi)存的映射文件,所述映射文件包括文件頭; 從所述文件頭中讀取寫偏移指針pWrite ; 從所述文件頭中讀取讀偏移指針PRead并快照到臨時(shí)變量中。
5.一種基于消息隊(duì)列的共享內(nèi)存讀取方法,所述消息隊(duì)列包括第二消息隊(duì)列,所述方法包括: 從共享內(nèi)存中讀取數(shù)據(jù); 將讀出的數(shù)據(jù)通過單線程進(jìn)隊(duì)push的操作壓入所述第二消息隊(duì)列,同時(shí),采用所述第二消息隊(duì)列執(zhí)行多線程出隊(duì)pop的操作; 其中,所述從共享內(nèi)存中讀取數(shù)據(jù)的步驟包括: 定位待讀取數(shù)據(jù)所在共享內(nèi)存的位置;獲得所述待讀取數(shù)據(jù)的長度; 獲取所述共享內(nèi)存的讀偏移指針PRead和寫偏移指針pWrite ; 依據(jù)所述讀偏移指針PRead和寫偏移指針pWrite,以及,所述待讀取數(shù)據(jù)的長度,判斷所述待讀取數(shù)據(jù)是否可讀; 若是,則從所述待讀取數(shù)據(jù)所在共享內(nèi)存的位置,讀出所述待讀取數(shù)據(jù); 其中,所述多線程出隊(duì)pop的操作包括: 判斷所述消息隊(duì)列是否已空; 若否,則分別計(jì)算n個(gè)線程出隊(duì)pop的偏移量;所述n為大于或等于I的正整數(shù); 依據(jù)所述n個(gè)線程出隊(duì)pop的偏移量,分別計(jì)算所述n個(gè)線程出隊(duì)pop的實(shí)際位置Pos ; 所述n個(gè)線程分別在其出隊(duì)pop的實(shí)際位置執(zhí)行出隊(duì)pop操作。
6.根據(jù)權(quán)利要求5所述的方法,其特征在于,在所述n個(gè)線程分別在其出隊(duì)pop的實(shí)際位置執(zhí)行出隊(duì)pop操作的步驟之后,還包括: 讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值; 按照所述n個(gè)線程出隊(duì)pop的操作,迭代增加所述CanWriteCount的值。
7.一種基于消息隊(duì)列的共享內(nèi)存讀寫的方法,所述消息隊(duì)列包括第一消息隊(duì)列和第二消息隊(duì)列,所述方法包括: 采用第一消息隊(duì)列執(zhí)行多線程進(jìn)隊(duì)push以及單線程出隊(duì)pop的操作; 將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存; 從所述共享內(nèi)存中讀取數(shù)據(jù); 將讀出的數(shù)據(jù)通過單線程進(jìn)隊(duì)push的操作壓入所述第二消息隊(duì)列,同時(shí),采用所述第二消息隊(duì)列執(zhí)行多線程出隊(duì)pop的操作; 其中,所述多線程進(jìn)隊(duì)push的操作包括: 讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值; 遞減所述CanWriteCount的值; 若獲得遞減后的CanWriteCount的值不為0,則判定所述消息隊(duì)列為未滿; 在所述消息隊(duì)列未滿時(shí),分別計(jì)算n個(gè)線程進(jìn)隊(duì)push的偏移量;所述n為大于或等于I的正整數(shù); 依據(jù)所述n個(gè)線程進(jìn)隊(duì)push的偏移量,分別計(jì)算所述n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置; 所述n個(gè)線程分別在其進(jìn)隊(duì)push的實(shí)際位置執(zhí)行進(jìn)隊(duì)push操作; 讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值; 按照所述n個(gè)線程進(jìn)隊(duì)push的操作,迭代增加所述CanReadCount的值; 其中,所述多線程出隊(duì)pop的操作包括: 讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值; 遞減所述CanReadCount的值; 若獲得遞減后的CanReadCount的值不為0,則判定所述消息隊(duì)列為未空; 在所述消息隊(duì)列未空時(shí),分別計(jì)算n個(gè)線程出隊(duì)pop的偏移量;所述n為大于或等于I的正整數(shù); 依據(jù)所述n個(gè)線程出隊(duì)pop的偏移量,分別計(jì)算所述n個(gè)線程出隊(duì)pop的實(shí)際位置;所述n個(gè)線程分別在其出隊(duì)pop的實(shí)際位置執(zhí)行出隊(duì)pop操作; 讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值; 按照所述n個(gè)線程出隊(duì)pop的操作,迭代增加所述CanWriteCount的值; 其中,將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存的步驟包括: 獲得所述單線程出隊(duì)pop的數(shù)據(jù)及其長度; 檢查所述數(shù)據(jù)的長度是否超出共享內(nèi)存的長度界限; 若否,則獲取所述共享內(nèi)存的讀偏移指針PRead和寫偏移指針pWrite ; 依據(jù)所述讀偏移指針PRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置,并判斷所述數(shù)據(jù)是否可寫; 若是,則在所述寫入位置寫入所述數(shù)據(jù); 其中,所述從共享內(nèi)存中讀取數(shù)據(jù)的步驟包括: 定位待讀取數(shù)據(jù)所在共享內(nèi)存的位置; 獲得所述待讀取數(shù)據(jù)的長度; 獲取所述共享內(nèi)存的讀偏移指針PRead和寫偏移指針pWrite ; 依據(jù)所述讀偏移指針PRead和寫偏移指針pWrite,以及,所述待讀取數(shù)據(jù)的長度,判斷所述待讀取數(shù)據(jù)是否可讀; 若是,則從所述待讀取數(shù)據(jù)所在共享內(nèi)存的位置,讀出所述待讀取數(shù)據(jù)。
8.一種基于消息隊(duì)列的共享內(nèi)存寫入系統(tǒng),所述消息隊(duì)列包括第一消息隊(duì)列,所述系統(tǒng)包括: 多線程進(jìn)隊(duì)push模塊及單線程出隊(duì)pop模塊,用于采用所述消息隊(duì)列執(zhí)行多線程進(jìn)隊(duì)push以及單線程出隊(duì)pop的操作; 數(shù)據(jù)寫入模塊,用于將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存; 其中,所述多線程進(jìn)隊(duì)push模塊包括: 第一判斷子模塊,用于判斷所述消息隊(duì)列是否已滿; 進(jìn)隊(duì)push偏移量計(jì)算子模塊,用于在消息隊(duì)列未滿時(shí),分別計(jì)算n個(gè)線程進(jìn)隊(duì)push的偏移量;所述n為大于或等于I的正整數(shù); 進(jìn)隊(duì)push的實(shí)際位置Pos計(jì)算子模塊,用于依據(jù)所述n個(gè)線程進(jìn)隊(duì)push的偏移量,分別計(jì)算所述n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置Pos ; 操作進(jìn)隊(duì)push子模塊,用于所述n個(gè)線程分別在其進(jìn)隊(duì)push的實(shí)際位置Pos執(zhí)行進(jìn)隊(duì)push操作; 其中,所述數(shù)據(jù)寫入模塊包括: 數(shù)據(jù)及其長度獲得子模塊,用于獲得所述單線程出隊(duì)pop的數(shù)據(jù)及其長度; 界限檢查子模塊,用于檢查所述數(shù)據(jù)的長度是否超出共享內(nèi)存的長度界限; 第一指針獲取子模塊,用于在所述數(shù)據(jù)的長度未超出共享內(nèi)存的長度界限時(shí),獲取所述共享內(nèi)存的讀偏移指針PRead和寫偏移指針pWrite ; 可寫判斷子模塊,用于依據(jù)所述讀偏移指針PRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置,并判斷所述數(shù)據(jù)是否可寫; 寫入子模塊,用于在數(shù)據(jù)可寫時(shí),在所述寫入位置寫入所述數(shù)據(jù)。
9.一種基于消息隊(duì)列的共享內(nèi)存讀取系統(tǒng),所述消息隊(duì)列包括第二消息隊(duì)列,所述系統(tǒng)包括: 數(shù)據(jù)讀取模塊,用于從共享內(nèi)存中讀取數(shù)據(jù); 單線程進(jìn)隊(duì)push模塊及多線程出隊(duì)pop模塊,用于將讀出的數(shù)據(jù)通過單線程進(jìn)隊(duì)push的操作壓入所述第二消息隊(duì)列,同時(shí),采用所述第二消息隊(duì)列執(zhí)行多線程出隊(duì)pop的操作;其中,所述數(shù)據(jù)讀取模塊包括: 定位子模塊,用于定位待讀取數(shù)據(jù)所在共享內(nèi)存的位置; 數(shù)據(jù)長度獲得子模塊,用于獲得所述待讀取數(shù)據(jù)的長度; 第二指針獲取子模塊,用于獲取所述共享內(nèi)存的讀偏移指針PRead和寫偏移指針pWrite ; 可讀判斷子模塊,用于依據(jù)所述讀偏移指針PRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,判斷所述待讀取數(shù)據(jù)是否可讀; 讀取子模塊,用于在所述數(shù)據(jù)可讀時(shí),從所述數(shù)據(jù)所在共享內(nèi)存的位置,讀出所述待讀取數(shù)據(jù); 其中,所述多線程出隊(duì)pop模塊包括: 第二判斷子模塊,用于判斷所述消息隊(duì)列是否已空; 出隊(duì)pop的偏移量計(jì)算子模塊,用于在消息隊(duì)列未空時(shí),分別計(jì)算n個(gè)線程出隊(duì)pop的偏移量;所述n為大于或等于I的正整數(shù); 出隊(duì)pop的實(shí)際位置Pos計(jì)算子模塊,用于依據(jù)所述n個(gè)線程出隊(duì)pop的偏移量,分別計(jì)算所述n個(gè)線程出隊(duì)pop的實(shí)際位置Pos ; 操作出隊(duì)pop子模塊,用于所述n個(gè)線程分別在其出隊(duì)pop的實(shí)際位置執(zhí)行出隊(duì)pop操作。
10.一種基于消息隊(duì)列的共享內(nèi)存讀寫的系統(tǒng),所述消息隊(duì)列包括第一消息隊(duì)列和第二消息隊(duì)列,所述方法包括: 第一進(jìn)隊(duì)push模塊和第一出隊(duì)pop模塊,用于采用第一消息隊(duì)列執(zhí)行多線程進(jìn)隊(duì)push以及單線程出隊(duì)pop的操作; 共享內(nèi)存寫入模塊,用于將所述單線程出隊(duì)pop的數(shù)據(jù)寫入共享內(nèi)存; 共享內(nèi)存讀取模塊,用于從所述共享內(nèi)存中讀取數(shù)據(jù); 第二進(jìn)隊(duì)push模塊和第二出隊(duì)pop模塊,用于將讀出的數(shù)據(jù)通過單線程進(jìn)隊(duì)push的操作壓入所述第二消息隊(duì)列,同時(shí),采用所述第二消息隊(duì)列執(zhí)行多線程出隊(duì)pop的操作;其中,所述第一進(jìn)隊(duì)push模塊包括: CanffriteCount參數(shù)讀取子模塊,用于讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值; CanffriteCount參數(shù)遞減子模塊,用于遞減所述CanWriteCount的值; 第三判斷子模塊,用于在獲得遞減后的CanWriteCount的值不為0,則判定所述消息隊(duì)列為未滿; push的偏移量計(jì)算子模塊,用于在所述消息隊(duì)列未滿時(shí),分別計(jì)算n個(gè)線程進(jìn)隊(duì)push的偏移量;所述n為大于或等于I的正整數(shù); push的實(shí)際位置計(jì)算子模塊,用于依據(jù)所述n個(gè)線程進(jìn)隊(duì)push的偏移量,分別計(jì)算所述n個(gè)線程進(jìn)隊(duì)push的實(shí)際位置; push操作執(zhí)行子模塊,用于所述n個(gè)線程分別在其進(jìn)隊(duì)push的實(shí)際位置執(zhí)行進(jìn)隊(duì)push操作; CanReadCount參數(shù)讀取子模塊,用于讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值;CanReadCount參數(shù)迭加子模塊,用于按照所述n個(gè)線程進(jìn)隊(duì)push的操作,迭代增加所述 CanReadCount 的值; 其中,所述第二出隊(duì)pop模塊包括: CanReadCount參數(shù)讀取子模塊,用于讀取可讀計(jì)數(shù)參數(shù)CanReadCount的值; CanReadCount參數(shù)遞減子模塊,用于遞減所述CanReadCount的值; 第四判斷子模塊,用于在獲得遞減后的CanReadCount的值不為0,則判定所述消息隊(duì)列為未空; pop的偏移量計(jì)算子模塊,用于在所述消息隊(duì)列未空時(shí),分別計(jì)算n個(gè)線程出隊(duì)pop的偏移量;所述n為大于或等于I的正整數(shù); pop的實(shí)際位置計(jì)算子模塊,用于依據(jù)所述n個(gè)線程出隊(duì)pop的偏移量,分別計(jì)算所述n個(gè)線程出隊(duì)pop的實(shí)際位置; pop操作執(zhí)行子模塊,用于所述n個(gè)線程分別在其出隊(duì)pop的實(shí)際位置執(zhí)行出隊(duì)pop操作; CanffriteCount參數(shù)讀取子模塊,用于讀取可寫計(jì)數(shù)參數(shù)CanWriteCount的值;CanffriteCount參數(shù)迭加子模塊,用于按照所述n個(gè)線程出隊(duì)pop的操作,迭代增加所述 CanWriteCount 的值; 其中,共享內(nèi)存寫入模塊包括: 數(shù)據(jù)獲得子模塊,用于獲得所述單線程出隊(duì)pop的數(shù)據(jù)及其長度; 檢查子模塊,用于檢查所述數(shù)據(jù)的長度是否超出共享內(nèi)存的長度界限; 第三指針獲取子模塊,用于在所述數(shù)據(jù)的長度未超出共享內(nèi)存的長度界限時(shí),獲取所述共享內(nèi)存的讀偏移指針PRead和寫偏移指針pWrite ; 數(shù)據(jù)可寫判斷子模塊,用于依據(jù)所述讀偏移指針PRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,確定所述數(shù)據(jù)在共享內(nèi)存中的寫入位置,并判斷所述數(shù)據(jù)是否可寫; 寫入數(shù)據(jù)子模塊,用于在數(shù)據(jù)可寫時(shí),在所述寫入位置寫入所述數(shù)據(jù); 其中,所述共享內(nèi)存讀取模塊包括: 數(shù)據(jù)定位子模塊,用于定位待讀取數(shù)據(jù)所在共享內(nèi)存的位置; 長度獲得子模塊,用于獲得所述待讀取數(shù)據(jù)的長度; 第四指針獲取子模塊,用于獲取所述共享內(nèi)存的讀偏移指針PRead和寫偏移指針pWrite ; 數(shù)據(jù)可讀判斷子模塊,用于依據(jù)所述讀偏移指針PRead和寫偏移指針pWrite,以及,所述數(shù)據(jù)的長度,判斷所述待讀取數(shù)據(jù)是否可讀; 讀取數(shù)據(jù)子模塊,用于在所述數(shù)據(jù)可讀時(shí),從所述數(shù)據(jù)所在共享內(nèi)存的位置,讀出所述待讀取數(shù)據(jù)。
【文檔編號(hào)】G06F9/46GK103645942SQ201310684074
【公開日】2014年3月19日 申請日期:2013年12月12日 優(yōu)先權(quán)日:2013年12月12日
【發(fā)明者】蔡?hào)|赟, 王東玉 申請人:北京奇虎科技有限公司, 奇智軟件(北京)有限公司