国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      在Linux上模擬實(shí)現(xiàn)Windows多對(duì)象同步等待機(jī)制的方法

      文檔序號(hào):6397486閱讀:223來源:國知局

      專利名稱::在Linux上模擬實(shí)現(xiàn)Windows多對(duì)象同步等待機(jī)制的方法
      技術(shù)領(lǐng)域
      :本發(fā)明屬于應(yīng)用軟件跨平臺(tái)遷移領(lǐng)域,尤其是一種在Linux上模擬實(shí)現(xiàn)Windows多對(duì)象同步等待機(jī)制的方法。
      背景技術(shù)
      :應(yīng)用程序的運(yùn)行不能直接訪問底層的系統(tǒng)資源,它們對(duì)系統(tǒng)資源的訪問都必須遵循操作系統(tǒng)所規(guī)定的方式,由此可見操作系統(tǒng)所扮演的重要角色。不同的操作系統(tǒng)由于立足點(diǎn)的不同,因此在設(shè)計(jì)思想上有著本質(zhì)的區(qū)別,從而導(dǎo)致其在設(shè)計(jì)架構(gòu)以及最終實(shí)現(xiàn)上所呈現(xiàn)的差異性。這些差異性具體反映在其所規(guī)定的系統(tǒng)資源訪問方式上。因此基于某種特定操作系統(tǒng)開發(fā)的應(yīng)用程序往往只能在這種特定的操作系統(tǒng)上運(yùn)行。然而如果能讓應(yīng)用程序擺脫對(duì)操作系統(tǒng)的依賴,不論從應(yīng)用程序提供商還是用戶來說,這都是非常有意義的。目前已有的遷移技術(shù)大致分為兩大類,一類是核內(nèi)差異核內(nèi)補(bǔ),典型的例子是浙大網(wǎng)新提出的“龍井(Longene)”項(xiàng)目,其主要是通過將Linux內(nèi)核擴(kuò)充成一個(gè)既支持Linux應(yīng)用也支持Windows應(yīng)用的兼容內(nèi)核,使得用戶可以直接在Linux操作系統(tǒng)上運(yùn)行Windows應(yīng)用程序。對(duì)內(nèi)核的修改并不適合商業(yè)化的Linux操作系統(tǒng),理由是,Linux商業(yè)化過程中,為實(shí)現(xiàn)商業(yè)目的,或多或少對(duì)其中采用的Linux內(nèi)核進(jìn)行了修改,再次的改動(dòng)很難避免與之前改動(dòng)不發(fā)生沖突,亦或使得改動(dòng)更為復(fù)雜,增加改動(dòng)引入錯(cuò)誤的風(fēng)險(xiǎn),因此限制了這類技術(shù)的適用范圍;另一類是核內(nèi)差異核外補(bǔ),典型的例子是WINE項(xiàng)目,WINE通過WINE服務(wù)進(jìn)程來虛擬Win32進(jìn)程,而應(yīng)用程序作為客戶端進(jìn)程,兩者之間通過socket和pipe通道,連接相應(yīng)的動(dòng)態(tài)鏈接庫Winelib,以協(xié)作運(yùn)行。WINE項(xiàng)目實(shí)質(zhì)上是通過操作指令的翻譯/轉(zhuǎn)換來彌補(bǔ)Windows和Linux之間的差異,然而兩個(gè)操作系統(tǒng)在系統(tǒng)資源訪問方式的實(shí)現(xiàn)上粒度是不一樣的,因此操作指令的翻譯/轉(zhuǎn)換在很大范圍內(nèi)難以保持一致。這兩種方式都有其一定局限性,因此嘗試通過對(duì)機(jī)制的重新構(gòu)建來解決應(yīng)用程序跨平臺(tái)遷移的問題。同步是操作系統(tǒng)中的一個(gè)重要概念,是保證系統(tǒng)中共享資源的諸進(jìn)程/線程間能協(xié)調(diào)運(yùn)行的關(guān)鍵所在。在Windows中,等待分為單對(duì)象等待和多對(duì)象等待。等待亦即等待對(duì)象的狀態(tài)置位。等待成功后修改對(duì)象的屬性,如釋放互斥對(duì)象等。等待還可以設(shè)置進(jìn)程/線程的“可被警報(bào)的(Alertable)”狀態(tài),亦即如果在等待過程有異步調(diào)用(asynchronousprocedurecall,簡稱APC)發(fā)送至等待線程,則線程退出等待狀態(tài),執(zhí)行異步調(diào)用。對(duì)于多對(duì)象等待,又分為多對(duì)象同時(shí)等待和多對(duì)象非同時(shí)等待。多對(duì)象同時(shí)等待亦即等待所有的對(duì)象同時(shí)變?yōu)橹梦?,如若某時(shí)刻只有部分對(duì)象置位,等待函數(shù)并不會(huì)修改這些對(duì)象的屬性。非同時(shí)等待亦即等待的某一個(gè)對(duì)象置位。在Linux中沒有實(shí)現(xiàn)多對(duì)象同時(shí)等待的功能。為此若將Windows上的應(yīng)用程序在Linux上運(yùn)行,需要在Linux上構(gòu)建了多對(duì)象(N)同時(shí)等待的機(jī)制,單對(duì)象等待可看作是N=I的情形。
      發(fā)明內(nèi)容本發(fā)明要解決的技術(shù)問題是如何在不修改Linux內(nèi)核的情況下,在Linux系統(tǒng)上重新構(gòu)建Windows的多對(duì)象同步等待機(jī)制。本發(fā)明針對(duì)上述問題,提出一種在Linux上模擬實(shí)現(xiàn)Windows多對(duì)象等待機(jī)制的方法,首先建立了三個(gè)集合waiting、signaled和result,waiting集合中管理著當(dāng)前處于等待狀態(tài)的線程,signaled集合中管理著當(dāng)前狀態(tài)處于置位的對(duì)象,result集合中管理著已經(jīng)滿足等待條件但還未釋放的線程;然后進(jìn)行如下步驟:步驟1:當(dāng)waiting集合中有新線程加入時(shí),新線程進(jìn)行全局信號(hào)量的釋放操作;步驟2:查看waiting集合中每一個(gè)線程的等待方式,對(duì)于每個(gè)線程,如果該線程是同時(shí)等待,轉(zhuǎn)入步驟3,如果該線程是非同時(shí)等待,轉(zhuǎn)入步驟4;步驟3:判斷線程所等待的所有對(duì)象是否在signaled集合中,若在,轉(zhuǎn)入步驟5,否則線程繼續(xù)等待,直到所等待的所有對(duì)象都在signaled集合中;步驟4:判斷線程所等待的對(duì)象中是否有一個(gè)在signaled集合中,如果有,轉(zhuǎn)入步驟5,否則,線程繼續(xù)等待,直到所等待的對(duì)象有一個(gè)在signaled集合中;步驟5:修改signaled集合中線程所等待的對(duì)象的屬性;步驟6:在result集合中建立線程的返回結(jié)果文件,并寫入返回結(jié)果;步驟7:將線程從waiting集合中刪除,釋放線程的等待信號(hào)量。采用本發(fā)明提供的方法,對(duì)于線程A在Linux上模擬實(shí)現(xiàn)Windows多對(duì)象等待機(jī)制的步驟如下:步驟一:線程A獲取全局信號(hào)量,將自己加入waiting集合中,并寫入等待信息;步驟二:線程A釋放全局信號(hào)量;步驟三:線程A等待自己的信號(hào)量,若等待時(shí)間間隔為無窮大,轉(zhuǎn)入步驟四,否則轉(zhuǎn)入步驟五;步驟四:線程A—直等待,若等待狀態(tài)的線程A觸發(fā)信號(hào),轉(zhuǎn)入步驟六;步驟五:線程A在指定的等待時(shí)間間隔內(nèi)等待,若在等待時(shí)間間隔內(nèi)的線程A觸發(fā)信號(hào),轉(zhuǎn)入步驟六,否則轉(zhuǎn)入步驟十二;步驟六:線程A從result集合中讀取signaled集合中同步對(duì)象已經(jīng)寫入線程A的等待函數(shù)的返回結(jié)果,線程A退出等待狀態(tài);步驟七:若返回結(jié)果為“WAIT_10_C0MPLET10N”,轉(zhuǎn)入步驟八,否則轉(zhuǎn)入步驟i^一;步驟八:判斷線程A是否處于“可被報(bào)警”狀態(tài),若是,轉(zhuǎn)入步驟九,否則轉(zhuǎn)入步驟十;步驟九:線程A重新獲取全局信號(hào)量,在線程A依次執(zhí)行完APC隊(duì)列中的APC后,檢查線程A的掛起計(jì)數(shù)是否為0,若掛起計(jì)數(shù)不為0,則線程A掛起,直到掛起解除,線程A釋放全局信號(hào)量,轉(zhuǎn)入步驟十三;若掛起計(jì)數(shù)為0,線程A釋放全局信號(hào)量,轉(zhuǎn)入步驟十三;所述的線程的APC隊(duì)列存儲(chǔ)在一個(gè)文件中,當(dāng)某個(gè)對(duì)象發(fā)送APC時(shí),該對(duì)象先獲取全局信號(hào)量,然后向目標(biāo)線程的APC隊(duì)列文件中寫入異步調(diào)用函數(shù)的信息,最后釋放全局信號(hào)量;步驟十:線程A重新獲取全局信號(hào)量,檢查線程A的掛起計(jì)數(shù)是否為0,若掛起計(jì)數(shù)不為0,則線程A掛起,直到掛起解除后,線程A再依次執(zhí)行完APC隊(duì)列中的APC,之后線程A釋放全局信號(hào)量,轉(zhuǎn)入步驟十三;若掛起計(jì)數(shù)為0,線程A依次執(zhí)行異步調(diào)用隊(duì)列中的異步調(diào)用,在執(zhí)行完畢后釋放全局信號(hào)量,轉(zhuǎn)入步驟十三;步驟十一:線程A重新獲取全局信號(hào)量,檢查線程A是否有掛起計(jì)數(shù),若不為0,則掛起自己,直到掛起解除,線程A釋放全局信號(hào)量,轉(zhuǎn)入步驟十三;若掛起計(jì)數(shù)為O,線程A釋放全局信號(hào)量,轉(zhuǎn)入步驟十三;步驟十二等待超時(shí),線程A退出等待狀態(tài),轉(zhuǎn)入步驟十三;步驟十三線程A退出等待函數(shù)。本發(fā)明的優(yōu)點(diǎn)與積極效果在于(I)采用集合的方式實(shí)現(xiàn)單對(duì)象/多對(duì)象的同時(shí)等待機(jī)制,方法簡單有效;(2)異步調(diào)用的模擬實(shí)現(xiàn)中沒有使用信號(hào)機(jī)制,本發(fā)明中采用的是生產(chǎn)者一消費(fèi)者模式,很好地解決了由于異步調(diào)用可能發(fā)生在線程執(zhí)行過程中的任意部分而導(dǎo)致的安全問題;(3)功能一致的基礎(chǔ)上保證了原理一致,有效地滿足了Windows應(yīng)用程序至Linux上源代碼級(jí)的無縫遷移。圖1是本發(fā)明在Linux上模擬實(shí)現(xiàn)Windows多對(duì)象同步等待機(jī)制方法的步驟流程圖;圖2是線程A使用本發(fā)明方法實(shí)現(xiàn)Windows多對(duì)象同步等待的步驟流程圖;圖3是本發(fā)明實(shí)施例的輸出結(jié)果示意圖。具體實(shí)施例方式下面將結(jié)合附圖和實(shí)施例對(duì)本發(fā)明作進(jìn)一步的詳細(xì)說明。本發(fā)明提出了一種在Linux上模擬實(shí)現(xiàn)Windows多對(duì)象同步等待機(jī)制的方法,用以在不修改Linux內(nèi)核的前提下,實(shí)現(xiàn)對(duì)Windows多對(duì)象同時(shí)等待WaitForMultipleObjectsO機(jī)制,有助于將Windows應(yīng)用程序無縫遷移至Linux操作系統(tǒng)上運(yùn)行,擴(kuò)大應(yīng)用程序的適用范圍。本發(fā)明分兩部分,第一部分是Windows等待機(jī)制在Linux上的模擬實(shí)現(xiàn)。思路是建立三個(gè)集合waiting,signaled和result。通過三個(gè)集合分別管理不同狀態(tài)下的線程,其中waiting集合中管理著當(dāng)前處于等待狀態(tài)的線程,signaled集合中管理著當(dāng)前狀態(tài)處于置位的對(duì)象,而result集合中管理著已經(jīng)滿足等待條件但還未釋放的線程。當(dāng)有線程進(jìn)入等待狀態(tài)或解除等待狀態(tài)時(shí),便在waiting集合中做相應(yīng)操作,添加或刪除線程。當(dāng)對(duì)象的狀態(tài)發(fā)生改變時(shí),對(duì)signaled集合進(jìn)行操作。當(dāng)線程的等待需求被滿足時(shí),result集合中增加該線程的返回結(jié)果,線程被釋放時(shí)讀取相對(duì)應(yīng)的返回結(jié)果并從result集合中刪除該線程。第二部分是Windows異步調(diào)用(asynchronousprocedurecall,APC)機(jī)制在Linux上的模擬實(shí)現(xiàn),為每一個(gè)線程建立一個(gè)APC隊(duì)列。APC隊(duì)列存儲(chǔ)于一個(gè)文件中。對(duì)象在發(fā)送APC前,首先需要獲得全局信號(hào)量,然后向目標(biāo)線程的APC隊(duì)列文件中寫入相關(guān)異步調(diào)用函數(shù)的信息,然后釋放全局信號(hào)量。線程執(zhí)行APC時(shí),同樣需要獲得全局信號(hào)量,然后從APC隊(duì)列文件中讀取異步調(diào)用函數(shù)信息并執(zhí)行該函數(shù)。如圖1所示,通過三個(gè)集合waiting,signaled和result在Linux上模擬實(shí)現(xiàn)Windows多對(duì)象等待機(jī)制的方法,步驟如下步驟1:當(dāng)waiting集合中有新線程加入時(shí),新線程進(jìn)行全局信號(hào)量的釋放操作。步驟2:查看waiting集合中每一個(gè)線程的等待方式,對(duì)于每個(gè)線程,進(jìn)行步驟3步驟7。如果該線程是同時(shí)等待,轉(zhuǎn)入步驟3,如果該線程是非同時(shí)等待,則轉(zhuǎn)入步驟4。步驟3:判斷線程所等待的所有對(duì)象是否在signaled集合中,若在,則等待需求已經(jīng)滿足,轉(zhuǎn)入步驟5,否則線程繼續(xù)等待,直到所等待的所有對(duì)象都在signaled集合中;對(duì)象的狀態(tài)處于置位時(shí),被加入到signaled集合中。若某線程等待的所有對(duì)象都處于signaled集合中,說明滿足了同時(shí)等待需求。步驟4:判斷線程所等待的對(duì)象中是否有一個(gè)在signaled集合中,如果存在這樣的對(duì)象,則等待需求已經(jīng)滿足,轉(zhuǎn)入步驟5,否則,等待需求未滿足,線程需要繼續(xù)等待,直到所等待的對(duì)象有一個(gè)在signaled集合中。步驟5:修改signaled集合中線程所等待的對(duì)象的屬性。步驟6:在result集合中建立線程的返回結(jié)果文件,并寫入返回結(jié)果。步驟7:將該線程從waiting集合中刪除,釋放線程的等待信號(hào)量。如圖2所示,對(duì)于線程A,采用本發(fā)明提供的方法,在Linux上模擬實(shí)現(xiàn)Windows同步機(jī)制,具體步驟如下:步驟一:線程A獲取全局信號(hào)量,將自己加入waiting集合中,并寫入等待信息;所述的全局信號(hào)量用來標(biāo)識(shí)線程能否加入waiting集合的資格。步驟二:線程A執(zhí)行釋放操作,釋放全局信號(hào)量。步驟三:線程A等待自己的信號(hào)量,若等待時(shí)間間隔dwMiIIiseconds為INFINITE,即等待時(shí)間間隔為無窮大,轉(zhuǎn)入步驟四,否則轉(zhuǎn)入步驟五。步驟四:線程A—直等待,當(dāng)?shù)却隣顟B(tài)的線程A觸發(fā)信號(hào)時(shí),轉(zhuǎn)入步驟六;步驟五:線程A在指定的等待時(shí)間間隔內(nèi)等待,若在等待時(shí)間間隔內(nèi),處于等待狀態(tài)的線程A觸發(fā)信號(hào),轉(zhuǎn)入步驟六,否則轉(zhuǎn)入步驟十二;步驟六:線程A從result集合中讀取signaled集合中同步對(duì)象已經(jīng)寫入線程A的等待函數(shù)的返回結(jié)果,線程A退出等待狀態(tài);例如,signaled集合中的同步對(duì)象是一個(gè)可等待計(jì)時(shí)器,是一個(gè)以時(shí)間規(guī)律變化狀態(tài)并且可以向線程發(fā)送APC的同步對(duì)象。此處的signaled集合中同步對(duì)象已經(jīng)寫入線程A的等待函數(shù)的返回結(jié)果,就是上面步驟6中線程A的返回結(jié)果文件中的結(jié)果。步驟七:若返回結(jié)果為“WAIT_10_C0MPLET10N”,轉(zhuǎn)入步驟八,否則轉(zhuǎn)入步驟i^一;返回結(jié)果WAIT_10_C0MPLET10N表示一個(gè)或多個(gè)I/O完成例程排隊(duì)等待執(zhí)行。步驟八:判斷線程A是否處于“可被報(bào)警(Alertable)”狀態(tài),若是,轉(zhuǎn)入步驟九,否則轉(zhuǎn)入步驟十。步驟九:線程A重新獲取全局信號(hào)量,在線程A依次執(zhí)行完APC隊(duì)列中的APC后檢查線程A的掛起計(jì)數(shù)是否為0,若不為0,則線程A掛起自己,直到掛起解除,線程A釋放全局信號(hào)量,轉(zhuǎn)入步驟十三;若掛起計(jì)數(shù)為0,則線程A釋放全局信號(hào)量,轉(zhuǎn)入步驟十三。步驟十:線程A重新獲取全局信號(hào)量,檢查線程A的掛起計(jì)數(shù)是否為0,若不為0,則掛起線程A自己,直到掛起解除后,線程A再依次執(zhí)行完APC隊(duì)列中的APC,線程A釋放全局信號(hào)量,轉(zhuǎn)入步驟十三;若掛起計(jì)數(shù)為0,線程A依次執(zhí)行異步調(diào)用隊(duì)列中的異步調(diào)用,在執(zhí)行完畢后釋放全局信號(hào)量,轉(zhuǎn)入步驟十三。步驟十一:線程A重新獲取全局信號(hào)量,檢查線程A是否有掛起計(jì)數(shù),若不為0,則掛起自己,直到掛起解除,線程A釋放全局信號(hào)量,轉(zhuǎn)入步驟十三;若掛起計(jì)數(shù)為0,線程A釋放全局信號(hào)量,轉(zhuǎn)入步驟十三。步驟十二:等待超時(shí),線程A退出等待狀態(tài),轉(zhuǎn)入步驟十三;步驟十三:線程A退出等待函數(shù)。Windows中,異步調(diào)用分為系統(tǒng)異步調(diào)用和用戶異步調(diào)用。每個(gè)線程有一個(gè)APC隊(duì)列(APCQueue),這個(gè)隊(duì)列存放當(dāng)前還未被處理的APC。系統(tǒng)異步調(diào)用由內(nèi)核發(fā)送。用戶異步調(diào)用必須要在線程進(jìn)入“可被警報(bào)的(Alertable)”狀態(tài)或者從掛起中解除時(shí)才會(huì)執(zhí)行。線程在執(zhí)行某些函數(shù)時(shí)(例如等待函數(shù)和休眠函數(shù)),可以選擇進(jìn)入“可被警報(bào)的”狀態(tài)。若有對(duì)象想要向此線程發(fā)送一個(gè)APC,則將此異步調(diào)用函數(shù)的信息添加到此線程的APC隊(duì)列的隊(duì)尾。而當(dāng)線程進(jìn)入“可被警報(bào)的”狀態(tài)時(shí),就會(huì)執(zhí)行APC隊(duì)列中隊(duì)首的元素對(duì)應(yīng)的異步調(diào)用函數(shù),并且將其從隊(duì)列中刪除。當(dāng)線程未進(jìn)入“可被警報(bào)的”狀態(tài)時(shí),APC并不會(huì)被“阻塞”而被忽略,只是其執(zhí)行是延后的。當(dāng)線程從掛起狀態(tài)中解除時(shí),它會(huì)執(zhí)行APC隊(duì)列中所有的APC。Windows對(duì)用戶異步調(diào)用做了很大限制,是“異步發(fā)送,同步調(diào)用”。原因是這樣可以避免在線程執(zhí)行過程中由于異步調(diào)用發(fā)生的隨意性而導(dǎo)致的安全問題。而在Linux中,異步調(diào)用(亦即信號(hào))是沒有限制的,其控制主要通過信號(hào)阻塞和解除信號(hào)阻塞來實(shí)現(xiàn)。其信號(hào)捕獲函數(shù)也不能“同步調(diào)用”,阻塞后便不會(huì)再被執(zhí)行。本發(fā)明在Linux系統(tǒng)中為每個(gè)線程建立一個(gè)APC隊(duì)列,該APC隊(duì)列存儲(chǔ)在一個(gè)文件中。對(duì)象如果要發(fā)送AP·C,需要先獲得全局信號(hào)量,然后向目標(biāo)線程的APC隊(duì)列文件中寫入相關(guān)異步調(diào)用函數(shù)的信息,最后釋放全局信號(hào)量。線程讀取到返回結(jié)果為“WAIT_10_C0MPLET10N”時(shí),等待狀態(tài)被異步調(diào)用中斷,獲取全局信號(hào)量,從APC隊(duì)列文件中讀取異步調(diào)用函數(shù)信息然后執(zhí)行該APC函數(shù),最后釋放全·局信號(hào)量。關(guān)鍵數(shù)據(jù)結(jié)構(gòu):typedefstruct_WAITABLEAPC_DATA//同步對(duì)象完成函數(shù)信息結(jié)構(gòu),也是APC隊(duì)列中每個(gè)元素的結(jié)構(gòu){PTMERAPCROUTINECompletionRoutine;//完成函數(shù)(亦即異步調(diào)用函數(shù))LPVOiDA丨'gToCompletionRoudiie;.//:;^成!水I數(shù)的參數(shù)unsignedlonglongTime;//|n]步對(duì)象狀態(tài)置位的絕對(duì)時(shí)間DWORDProcessId;//同步對(duì)象被激活時(shí)創(chuàng)建的進(jìn)程的進(jìn)程號(hào)}WAITABLEAPCDATA;其中,PTMERAPCROUTINE表示一個(gè)Win32數(shù)據(jù)類型,意思是:指向一定時(shí)器完成程序;LPVOID表示指向任何類型值的數(shù)據(jù)類型!unsignedlonglong表示一個(gè)長整型數(shù)據(jù)類型;DW0RD表示雙字節(jié)數(shù)據(jù)類型。測(cè)試用例:用例采用的是同步問題中經(jīng)典的“哲學(xué)家就餐”問題。問·題描述:五個(gè)哲學(xué)家圍著一個(gè)圓桌就餐,每個(gè)哲學(xué)家之間放置一根筷子,圓桌上總共五根筷子。哲學(xué)家們?cè)陴囸I的時(shí)候就餐,就餐之后開始研究工作,哲學(xué)家的狀態(tài)在就餐和研究之間轉(zhuǎn)換。當(dāng)哲學(xué)家饑餓的時(shí)候,需要同時(shí)拿起左側(cè)和右側(cè)的兩根筷子才能就餐,否則就一直等待。同步對(duì)象的完成函數(shù)TimerAPCProcO是一個(gè)回調(diào)函數(shù),異步調(diào)用執(zhí)行完后自動(dòng)調(diào)用此函數(shù),用于在屏幕上輸出顯示每一次異步調(diào)用的結(jié)束。線程起始函數(shù)Start循環(huán)N次{Stepl:每一次循環(huán)均設(shè)置WaitForMultipleObjectsO中同時(shí)不限時(shí)等待句柄數(shù)組e對(duì)應(yīng)的2個(gè)對(duì)象為“可被警報(bào)的”狀態(tài),返回值存入result;Step2:判斷每一次循環(huán)中等待函數(shù)是否被異步調(diào)用中斷,若中斷則跳出本輪循環(huán)直接進(jìn)入下一輪循環(huán)等待;Step3:編號(hào)為arg的哲學(xué)家開始就餐,就餐時(shí)間為指定的time;Step4:編號(hào)為arg的哲學(xué)家的左右兩側(cè)筷子置位;}主函數(shù)Stepl:循環(huán)5次,每一次均用CreateEventO創(chuàng)建一個(gè)初始狀態(tài)為置位的無名事件,句柄為c[i];Step2:循環(huán)5次,每一次均用CreateThreadO創(chuàng)建一個(gè)起始函數(shù)為start,參數(shù)為(LPVOID)i的線程,句柄為p[i_l];Step3:用WaitForMultipleObjectsO創(chuàng)建同時(shí)不限時(shí)等待句柄數(shù)組P對(duì)應(yīng)的5個(gè)對(duì)象。將測(cè)試用例的函數(shù)用C語言程序?qū)崿F(xiàn),然后放在Linux上執(zhí)行,本發(fā)明提供的模擬實(shí)現(xiàn)Windows多對(duì)象同步等待機(jī)制的方法在頭文件中聲明,執(zhí)行時(shí)候會(huì)調(diào)用本發(fā)明方法,如圖3所示為測(cè)試用例的結(jié)果圖,對(duì)結(jié)果進(jìn)行分析,能夠得出如下結(jié)論(I)Windows應(yīng)用程序中所有使用的WINAPI均能在Linux下編譯成功。(2)整個(gè)過程沒有死鎖發(fā)生,多對(duì)象同時(shí)等待成功實(shí)現(xiàn)。(3)“PhilosopherX:1’mdoingresearch”的不規(guī)律反復(fù)出現(xiàn)說明用戶異步調(diào)用的實(shí)現(xiàn)正確。權(quán)利要求1.一種在Linux上模擬實(shí)現(xiàn)Windows多對(duì)象同步等待機(jī)制的方法,其特征在于,首先建立了三個(gè)集合waiting、signaled和result,waiting集合中管理著當(dāng)前處于等待狀態(tài)的線程,signaled集合中管理著當(dāng)前狀態(tài)處于置位的對(duì)象,result集合中管理著已經(jīng)滿足等待條件但還未釋放的線程;然后進(jìn)行如下步驟:步驟1:當(dāng)waiting集合中有新線程加入時(shí),新線程進(jìn)行全局信號(hào)量的釋放操作;步驟2:查看waiting集合中每一個(gè)線程的等待方式,對(duì)于每個(gè)線程,如果該線程是同時(shí)等待,轉(zhuǎn)入步驟3,如果該線程是非同時(shí)等待,轉(zhuǎn)入步驟4;步驟3:判斷線程所等待的所有對(duì)象是否在signaled集合中,若在,轉(zhuǎn)入步驟5,否則線程繼續(xù)等待,直到所等待的所有對(duì)象都在signaled集合中;步驟4:判斷線程所等待的對(duì)象中是否有一個(gè)在signaled集合中,如果有,轉(zhuǎn)入步驟5,否則,線程繼續(xù)等待,直到所等待的對(duì)象有一個(gè)在signaled集合中;步驟5:修改signaled集合中線程所等待的對(duì)象的屬性;步驟6:在result集合中建立線程的返回結(jié)果文件,并寫入返回結(jié)果;步驟7:將線程從waiting集合中刪除,釋放線程的等待信號(hào)量。2.基于權(quán)利要求1所述的模擬實(shí)現(xiàn)Windows多對(duì)象同步等待機(jī)制的方法,對(duì)于線程A,在Linux上模擬實(shí)現(xiàn)Windows多對(duì)象同步等待的具體步驟如下:步驟一:線程A獲取全局信號(hào)量,將自己加入waiting集合中,并寫入等待信息;步驟二:線程A釋放全局信號(hào)量;步驟三:線程A等待自己的信號(hào)量,若等待時(shí)間間隔為無窮大,轉(zhuǎn)入步驟四,否則轉(zhuǎn)入步驟五;`步驟四:線程A—直等待,若等待狀態(tài)的線程A觸發(fā)信號(hào),轉(zhuǎn)入步驟六;步驟五:線程A在指定的等待時(shí)間間隔內(nèi)等待,若在等待時(shí)間間隔內(nèi)線程A觸發(fā)信號(hào),轉(zhuǎn)入步驟六,否則轉(zhuǎn)入步驟十二;步驟六:線程A從result集合中讀取signaled集合中同步對(duì)象已經(jīng)寫入線程A的等待函數(shù)的返回結(jié)果,線程A退出等待狀態(tài);步驟七:若返回結(jié)果為“WAIT_10_C0MPLET10N”,轉(zhuǎn)入步驟八,否則轉(zhuǎn)入步驟i^一;WAIT_10_C0MPLET10N表示一個(gè)以上的I/O完成例程排隊(duì)等待執(zhí)行;步驟八:判斷線程A是否處于“可被報(bào)警”狀態(tài),若是,轉(zhuǎn)入步驟九,否則轉(zhuǎn)入步驟十;步驟九:線程A重新獲取全局信號(hào)量,在線程A依次執(zhí)行完異步調(diào)用隊(duì)列中的異步調(diào)用后,檢查線程A的掛起計(jì)數(shù)是否為0,若掛起計(jì)數(shù)不為0,則線程A掛起,直到掛起解除,然后線程A釋放全局信號(hào)量,轉(zhuǎn)入步驟十三;若掛起計(jì)數(shù)為0,線程A釋放全局信號(hào)量,轉(zhuǎn)入步驟十三;所述的線程的異步調(diào)用隊(duì)列存儲(chǔ)在一個(gè)文件中,當(dāng)某個(gè)對(duì)象發(fā)送異步調(diào)用時(shí),該對(duì)象先獲取全局信號(hào)量,然后向目標(biāo)線程的異步調(diào)用隊(duì)列文件中寫入異步調(diào)用函數(shù)的信息,最后釋放全局信號(hào)量;步驟十:線程A重新獲取全局信號(hào)量,檢查線程A的掛起計(jì)數(shù)是否為0,若掛起計(jì)數(shù)不為O,線程A掛起,直到掛起解除后,線程A再依次執(zhí)行完異步調(diào)用隊(duì)列中的異步調(diào)用,然后線程A釋放全局信號(hào)量,轉(zhuǎn)入步驟十三;若掛起計(jì)數(shù)為0,線程A依次執(zhí)行異步調(diào)用隊(duì)列中的異步調(diào)用,在執(zhí)行完畢后釋放全局信號(hào)量,轉(zhuǎn)入步驟十三;步驟十一:線程A重新獲取全局信號(hào)量,檢查線程A的掛起計(jì)數(shù)是否為0,若掛起計(jì)數(shù)不為O,則線程A掛起,直到掛起解除,然后線程A釋放全局信號(hào)量,轉(zhuǎn)入步驟十三;若掛起計(jì)數(shù)為O,線程A釋放全局信號(hào)量,轉(zhuǎn)入步驟十三;步驟十二:等待超時(shí),線程A退出等待狀態(tài),轉(zhuǎn)入步驟十三;步驟十三:線程A退出等待函數(shù)。全文摘要本發(fā)明是一種在Linux上模擬實(shí)現(xiàn)Windows多對(duì)象同步等待機(jī)制的方法,建立三個(gè)集合來管理不同狀態(tài)下的線程,有線程進(jìn)入或解除等待狀態(tài)時(shí),管理waiting集合,當(dāng)對(duì)象的狀態(tài)發(fā)生改變時(shí),管理signaled集合,當(dāng)線程等待需求被滿足時(shí),管理result集合;同時(shí),本方法為每個(gè)線程建立一個(gè)APC隊(duì)列文件,某對(duì)象在發(fā)送APC前,先獲得全局信號(hào)量,再向目標(biāo)線程的APC隊(duì)列文件中寫入相關(guān)異步調(diào)用函數(shù)。線程執(zhí)行APC時(shí),需獲得全局信號(hào)量,然后從APC隊(duì)列文件中讀取并執(zhí)行異步調(diào)用函數(shù)。本發(fā)明方法簡單有效,很好地解決了Linux上由于異步調(diào)用可能發(fā)生在線程執(zhí)行過程中的任意部分而導(dǎo)致的安全問題。文檔編號(hào)G06F9/44GK103077031SQ20131000374公開日2013年5月1日申請(qǐng)日期2013年1月6日優(yōu)先權(quán)日2013年1月6日發(fā)明者李睿,楊南君,呂江花,馬世龍申請(qǐng)人:北京航空航天大學(xué)
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
      1