本發(fā)明涉及電子技術(shù)領(lǐng)域,尤其涉及一種多線程爭搶資源的模擬方法及裝置。
背景技術(shù):
Android系統(tǒng)中對臨界資源的訪問,比如:更新UI(User Interface,用戶界面)、操作非線程安全的數(shù)據(jù)結(jié)構(gòu)等,這些邏輯正常情況下都需要加以同步,否則會引發(fā)多線程爭搶資源導(dǎo)致的系統(tǒng)崩潰,但很多開發(fā)人員在開發(fā)過程中,并未注意到這一點(diǎn),往往經(jīng)過簡單自測之后并沒有引發(fā)系統(tǒng)崩潰,然而,在將產(chǎn)品發(fā)布到外網(wǎng)之后,由于用戶的場景千差萬別,很容易引發(fā)多線程爭搶資源導(dǎo)致系統(tǒng)崩潰,因此,如何在測試過程中提高復(fù)現(xiàn)多線程爭搶資源導(dǎo)致系統(tǒng)崩潰的概率,是一個亟需解決的問題。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明實(shí)施例提供一種多線程爭搶資源的模擬方法及裝置。可以提高復(fù)現(xiàn)多線程爭搶資源導(dǎo)致系統(tǒng)崩潰的概率。
本發(fā)明實(shí)施例提供了一種多線程爭搶資源的模擬方法,包括:
當(dāng)檢測到線程調(diào)用用于訪問目標(biāo)資源的運(yùn)行函數(shù)時,對所述線程所調(diào)用的所述運(yùn)行函數(shù)進(jìn)行加鎖以停止執(zhí)行所述運(yùn)行函數(shù),并統(tǒng)計(jì)所述運(yùn)行函數(shù)被加鎖的線程數(shù)量;
確定所述運(yùn)行函數(shù)被加鎖的線程數(shù)量是否超過預(yù)設(shè)閾值;
若所述運(yùn)行函數(shù)被加鎖的線程數(shù)量超過所述預(yù)設(shè)閾值,則釋放被加鎖的所有所述運(yùn)行函數(shù),并同步執(zhí)行所釋放的所有所述運(yùn)行函數(shù),以使調(diào)用所述所釋放的運(yùn)行函數(shù)的所有線程同時訪問所述目標(biāo)資源。
其中,所述確定所述運(yùn)行函數(shù)被加鎖的線程數(shù)量是否超過預(yù)設(shè)閾值之后,還包括:
將被加鎖的所有所述運(yùn)行函數(shù)中第一個被加鎖的運(yùn)行函數(shù)的加鎖時間點(diǎn)作為起始時間點(diǎn),計(jì)算等待時間;
若所述運(yùn)行函數(shù)被加鎖的線程數(shù)量未超過所述預(yù)設(shè)閾值但所述等待時間超過預(yù)設(shè)時間范圍,則釋放被加鎖的所有所述運(yùn)行函數(shù)。
其中,所述當(dāng)檢測到線程調(diào)用用于訪問目標(biāo)資源的運(yùn)行函數(shù)時,對所述線程所調(diào)用的所述運(yùn)行函數(shù)進(jìn)行加鎖以停止執(zhí)行所述運(yùn)行函數(shù)之前,還包括:
對所述運(yùn)行函數(shù)進(jìn)行Hook以監(jiān)控所述線程是否調(diào)用用于訪問所述目標(biāo)資源的運(yùn)行函數(shù);
所述當(dāng)檢測到線程調(diào)用用于訪問目標(biāo)資源的運(yùn)行函數(shù)時,對所述線程所調(diào)用的所述運(yùn)行函數(shù)進(jìn)行加鎖以停止執(zhí)行所述運(yùn)行函數(shù)包括:
當(dāng)檢測到線程調(diào)用用于訪問所述目標(biāo)資源的運(yùn)行函數(shù)時,使用Hook函數(shù)對所述線程所調(diào)用的所述運(yùn)行函數(shù)進(jìn)行加鎖。
其中,所述確定所述運(yùn)行函數(shù)被加鎖的線程數(shù)量是否超過預(yù)設(shè)閾值包括:
當(dāng)每次檢測到一個線程調(diào)用用于訪問所述目標(biāo)資源的所述運(yùn)行函數(shù)時,通過預(yù)置計(jì)數(shù)器將所述預(yù)設(shè)閾值減1;
判斷所述預(yù)設(shè)閾值是否減小至0。
其中,所述同步執(zhí)行所釋放的所有所述運(yùn)行函數(shù),以使調(diào)用所述所釋放的運(yùn)行函數(shù)的所有線程同時訪問所述目標(biāo)資源之后,還包括:
當(dāng)檢測到所述所有線程同時訪問所述目標(biāo)資源發(fā)生系統(tǒng)崩潰時,顯示提示信息,所述提示信息用于提示用戶多線程爭搶資源是否模擬成功。
相應(yīng)地,本發(fā)明實(shí)施例提供了一種多線程爭搶資源的模擬裝置,包括:
函數(shù)處理模塊,用于當(dāng)檢測到線程調(diào)用用于訪問目標(biāo)資源的運(yùn)行函數(shù)時,對所述線程所調(diào)用的所述運(yùn)行函數(shù)進(jìn)行加鎖以停止執(zhí)行所述運(yùn)行函數(shù),并統(tǒng)計(jì)所述運(yùn)行函數(shù)被加鎖的線程數(shù)量;
數(shù)量確定模塊,用于確定所述運(yùn)行函數(shù)被加鎖的線程數(shù)量是否超過預(yù)設(shè)閾值;
資源訪問模塊,用于若所述運(yùn)行函數(shù)被加鎖的線程數(shù)量超過所述預(yù)設(shè)閾值,則釋放被加鎖的所有所述運(yùn)行函數(shù),并同步執(zhí)行所釋放的所有所述運(yùn)行函數(shù),以使調(diào)用所述所釋放的運(yùn)行函數(shù)的所有線程同時訪問所述目標(biāo)資源。
其中,所述資源訪問模塊,還用于將被加鎖的所有所述運(yùn)行函數(shù)中第一個被加鎖的運(yùn)行函數(shù)的加鎖時間點(diǎn)作為起始時間點(diǎn),計(jì)算等待時間;若所述運(yùn)行函數(shù)被加鎖的線程數(shù)量未超過所述預(yù)設(shè)閾值但所述等待時間超過預(yù)設(shè)時間范圍,則釋放被加鎖的所有所述運(yùn)行函數(shù)。
其中,所述函數(shù)處理模塊具體用于:
對所述運(yùn)行函數(shù)進(jìn)行Hook以監(jiān)控所述線程是否調(diào)用用于訪問所述目標(biāo)資源的運(yùn)行函數(shù);
當(dāng)檢測到線程調(diào)用用于訪問目標(biāo)資源的運(yùn)行函數(shù)時,使用Hook函數(shù)對所述線程所調(diào)用的所述運(yùn)行函數(shù)進(jìn)行加鎖。
其中,所述數(shù)量確定模塊具體用于:
當(dāng)每次檢測到一個線程調(diào)用用于訪問所述目標(biāo)資源的所述運(yùn)行函數(shù),通過預(yù)置計(jì)數(shù)器將所述預(yù)設(shè)閾值減1;
判斷所述預(yù)設(shè)閾值是否減小至0。
其中,所述裝置還包括:
信息顯示模塊,用于當(dāng)檢測到所述所有線程同時訪問所述目標(biāo)資源發(fā)生系統(tǒng)崩潰時,顯示提示信息,所述提示信息用于提示用戶多線程爭搶資源是否模擬成功。
相應(yīng)地,本發(fā)明實(shí)施例提供了一種多線程爭搶資源的模擬裝置,所述裝置包括接口電路、存儲器以及處理器,其中,存儲器中存儲一組程序代碼,且處理器用于調(diào)用存儲器中存儲的程序代碼,用于執(zhí)行以下操作:
當(dāng)檢測到線程調(diào)用用于訪問目標(biāo)資源的運(yùn)行函數(shù)時,對所述線程所調(diào)用的所述運(yùn)行函數(shù)進(jìn)行加鎖以停止執(zhí)行所述運(yùn)行函數(shù),并統(tǒng)計(jì)所述運(yùn)行函數(shù)被加鎖的線程數(shù)量;
確定所述運(yùn)行函數(shù)被加鎖的線程數(shù)量是否超過預(yù)設(shè)閾值;
若所述運(yùn)行函數(shù)被加鎖的線程數(shù)量超過所述預(yù)設(shè)閾值,則釋放被加鎖的所有所述運(yùn)行函數(shù),并同步執(zhí)行所釋放的所有所述運(yùn)行函數(shù),以使調(diào)用所述所釋放的運(yùn)行函數(shù)的所有線程同時訪問所述目標(biāo)資源。
實(shí)施本發(fā)明實(shí)施例,首先當(dāng)檢測到線程調(diào)用用于訪問目標(biāo)資源的運(yùn)行函數(shù)時,對所述線程所調(diào)用的所述運(yùn)行函數(shù)進(jìn)行加鎖以停止執(zhí)行所述運(yùn)行函數(shù),并統(tǒng)計(jì)所述運(yùn)行函數(shù)被加鎖的線程數(shù)量;然后確定所述運(yùn)行函數(shù)被加鎖的線程數(shù)量是否超過預(yù)設(shè)閾值;最后若所述運(yùn)行函數(shù)被加鎖的線程數(shù)量超過所述預(yù)設(shè)閾值,則釋放被加鎖的所有所述運(yùn)行函數(shù),并同步執(zhí)行所釋放的所有所述運(yùn)行函數(shù),以使調(diào)用所述所釋放的運(yùn)行函數(shù)的所有線程同時訪問所述目標(biāo)資源,通過在測試過程中模擬多個線程同時爭搶資源,從而提高復(fù)現(xiàn)多線程爭搶資源導(dǎo)致系統(tǒng)崩潰的概率,幫助開發(fā)人員定位到多線程同步的問題。
附圖說明
為了更清楚地說明本發(fā)明實(shí)施例的技術(shù)方案,下面將對實(shí)施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖是本發(fā)明的一些實(shí)施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1是本發(fā)明提出的一種多線程爭搶資源的模擬方法的第一實(shí)施例的流程示意圖;
圖2是本發(fā)明提出的一種多線程爭搶資源的模擬方法的第二實(shí)施例的流程示意圖;
圖3是本發(fā)明實(shí)施例提出的一種多線程爭搶資源的模擬裝置的結(jié)構(gòu)示意圖;
圖4是本發(fā)明實(shí)施例提出的另一種多線程爭搶資源的模擬裝置的結(jié)構(gòu)示意圖。
具體實(shí)施方式
下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
請參考圖1,圖1是本發(fā)明提出的一種多線程爭搶資源的模擬方法的第一實(shí)施例的流程示意圖。如圖所示,本發(fā)明實(shí)施例中的方法包括:
S101,當(dāng)檢測到線程調(diào)用用于訪問目標(biāo)資源的運(yùn)行函數(shù)時,對所述線程所調(diào)用的所述運(yùn)行函數(shù)進(jìn)行加鎖以停止執(zhí)行所述運(yùn)行函數(shù),并統(tǒng)計(jì)所述運(yùn)行函數(shù)被加鎖的線程數(shù)量。
具體實(shí)現(xiàn)中,可以對所述運(yùn)行函數(shù)進(jìn)行Hook以監(jiān)控所述線程是否調(diào)用用于訪問所述目標(biāo)資源的運(yùn)行函數(shù);當(dāng)檢測到線程調(diào)用用于訪問目標(biāo)資源的運(yùn)行函數(shù)時,使用Hook函數(shù)對所述線程所調(diào)用的所述運(yùn)行函數(shù)進(jìn)行加鎖。
可選的,當(dāng)檢測到線程調(diào)用用于訪問目標(biāo)資源的運(yùn)行函數(shù)時,可以首先確定線程所調(diào)用的運(yùn)行函數(shù)是否已加鎖,若線程所調(diào)用的運(yùn)行函數(shù)未加鎖,可以對線程所調(diào)用的運(yùn)行函數(shù)進(jìn)行加鎖,如果線程所調(diào)用的運(yùn)行函數(shù)已加鎖,則繼續(xù)檢測是否存在新線程調(diào)用運(yùn)行函數(shù)將要訪問目標(biāo)資源。
需要說明的是,Hook(鉤子)是系統(tǒng)消息處理機(jī)制的一個平臺,應(yīng)用程序可以在上面設(shè)置子程序以監(jiān)視指定函數(shù)的行為動作,而且所監(jiān)視的指定函數(shù)可以是其他線程所創(chuàng)建的,在執(zhí)行處理該指定函數(shù)之前可以先處理線程信息。另外,Hook機(jī)制允許應(yīng)用程序截獲處理Window消息或特定事件,鉤子實(shí)際上是一個處理消息的程序段,通過系統(tǒng)調(diào)用,將Hook函數(shù)掛入系統(tǒng),在執(zhí)行卸載鍵盤布局之前,Hook函數(shù)就先捕獲線程信息,進(jìn)而Hook函數(shù)可以加工處理該線程信息,也可以不作處理而繼續(xù)傳遞該線程信息,還可以強(qiáng)制結(jié)束該線程信息的傳遞。
S102,確定所述運(yùn)行函數(shù)被加鎖的線程數(shù)量是否超過預(yù)設(shè)閾值。
具體實(shí)現(xiàn)中,當(dāng)每次檢測到一個線程調(diào)用用于訪問所述目標(biāo)資源的所述運(yùn)行函數(shù)時,通過預(yù)置計(jì)數(shù)器將所述預(yù)設(shè)閾值減1;判斷所述預(yù)設(shè)閾值是否減小至0。例如,將計(jì)數(shù)器的初始值設(shè)置為5,表示最多允許5個線程同時訪問目標(biāo)資源,每次有新線程請求時,將計(jì)數(shù)器的數(shù)值減1,并判斷計(jì)數(shù)器設(shè)置的初始值是否減小至0。
S103,若所述運(yùn)行函數(shù)被加鎖的線程數(shù)量超過所述預(yù)設(shè)閾值,則釋放被加鎖的所有所述運(yùn)行函數(shù),并同步執(zhí)行所釋放的所有所述運(yùn)行函數(shù),以使調(diào)用所述所釋放的運(yùn)行函數(shù)的所有線程同時訪問所述目標(biāo)資源。
例如,當(dāng)計(jì)數(shù)器的數(shù)值減小至0時,同時釋放將要訪問所述目標(biāo)資源的5個線程調(diào)用運(yùn)行函數(shù),執(zhí)行每個線程所調(diào)用的運(yùn)行函數(shù)同時訪問目標(biāo)資源,模擬出5個線程爭搶目標(biāo)資源的場景,從而確定在5個線程爭搶目標(biāo)資源時是否發(fā)生系統(tǒng)崩潰,提高復(fù)現(xiàn)多線程爭搶資源導(dǎo)致系統(tǒng)崩潰的概率,幫助開發(fā)人員定位到多線程同步的問題。
可選的,可以將被加鎖的所有所述運(yùn)行函數(shù)中第一個被加鎖的運(yùn)行函數(shù)的加鎖時間點(diǎn)作為起始時間點(diǎn),計(jì)算等待時間;若所述運(yùn)行函數(shù)被加鎖的線程數(shù)量未超過所述預(yù)設(shè)閾值但所述等待時間超過預(yù)設(shè)時間范圍,則釋放被加鎖的所有所述運(yùn)行函數(shù)。
需要說明的是,為了防止將要調(diào)用目標(biāo)資源的線程數(shù)達(dá)不到計(jì)數(shù)器的初始值,可以通過計(jì)時器設(shè)定一個時間范圍,如果在預(yù)設(shè)時間范圍內(nèi)所述運(yùn)行函數(shù)被加鎖的線程數(shù)量超過預(yù)設(shè)閾值,則立刻釋放所有線程所調(diào)用的運(yùn)行函數(shù),如果將要訪問所述目標(biāo)資源的線程數(shù)量未超過預(yù)設(shè)閾值但等待時間超過預(yù)設(shè)時間范圍,也立刻釋放所有線程所調(diào)用的運(yùn)行函數(shù),防止出現(xiàn)線程長時間不能執(zhí)行運(yùn)行函數(shù)的問題,也能起到延遲線程執(zhí)行的作用。
在本發(fā)明實(shí)施例中,首先當(dāng)檢測到線程調(diào)用用于訪問目標(biāo)資源的運(yùn)行函數(shù)時,對所述線程所調(diào)用的所述運(yùn)行函數(shù)進(jìn)行加鎖以停止執(zhí)行所述運(yùn)行函數(shù),并統(tǒng)計(jì)所述運(yùn)行函數(shù)被加鎖的線程數(shù)量;然后確定所述運(yùn)行函數(shù)被加鎖的線程數(shù)量是否超過預(yù)設(shè)閾值;最后若所述運(yùn)行函數(shù)被加鎖的線程數(shù)量超過所述預(yù)設(shè)閾值,則釋放被加鎖的所有所述運(yùn)行函數(shù),并同步執(zhí)行所釋放的所有所述運(yùn)行函數(shù),以使調(diào)用所述所釋放的運(yùn)行函數(shù)的所有線程同時訪問所述目標(biāo)資源,通過在測試過程中模擬多個線程同時爭搶資源,從而提高復(fù)現(xiàn)多線程爭搶資源導(dǎo)致系統(tǒng)崩潰的概率,幫助開發(fā)人員定位到多線程同步的問題。
請參考圖2,圖2是本發(fā)明提出的一種多線程爭搶資源的模擬方法的第二實(shí)施例的流程示意圖。如圖所示,本發(fā)明實(shí)施例中的方法包括:
S201,當(dāng)檢測到線程調(diào)用用于訪問目標(biāo)資源的運(yùn)行函數(shù)時,對所述線程所調(diào)用的所述運(yùn)行函數(shù)進(jìn)行加鎖以停止執(zhí)行所述運(yùn)行函數(shù),并統(tǒng)計(jì)所述運(yùn)行函數(shù)被加鎖的線程數(shù)量。
具體實(shí)現(xiàn)中,可以對所述運(yùn)行函數(shù)進(jìn)行Hook以監(jiān)控所述線程是否調(diào)用用于訪問所述目標(biāo)資源的運(yùn)行函數(shù);當(dāng)檢測到線程調(diào)用用于訪問目標(biāo)資源的運(yùn)行函數(shù)時,使用Hook函數(shù)對所述線程所調(diào)用的所述運(yùn)行函數(shù)進(jìn)行加鎖。
可選的,當(dāng)檢測到線程調(diào)用用于訪問目標(biāo)資源的運(yùn)行函數(shù)時,可以首先確定線程所調(diào)用的運(yùn)行函數(shù)是否已加鎖,若線程所調(diào)用的運(yùn)行函數(shù)未加鎖,可以對線程所調(diào)用的運(yùn)行函數(shù)進(jìn)行加鎖,如果線程所調(diào)用的運(yùn)行函數(shù)已加鎖,則檢測是否存在新線程調(diào)用運(yùn)行函數(shù)將要訪問目標(biāo)資源。
需要說明的是,Hook(鉤子)是系統(tǒng)消息處理機(jī)制的一個平臺,應(yīng)用程序可以在上面設(shè)置子程序以監(jiān)視指定函數(shù)的行為動作,而且所監(jiān)視的指定函數(shù)可以是其他線程所創(chuàng)建的,在執(zhí)行處理該指定函數(shù)之前可以先處理線程信息。另外,Hook機(jī)制允許應(yīng)用程序截獲處理Window消息或特定事件,鉤子實(shí)際上是一個處理消息的程序段,通過系統(tǒng)調(diào)用,將Hook函數(shù)掛入系統(tǒng),在執(zhí)行卸載鍵盤布局之前,Hook函數(shù)就先捕獲線程信息,進(jìn)而Hook函數(shù)可以加工處理該線程信息,也可以不作處理而繼續(xù)傳遞該線程信息,還可以強(qiáng)制結(jié)束該線程信息的傳遞。
S202,確定所述運(yùn)行函數(shù)被加鎖的線程數(shù)量是否超過預(yù)設(shè)閾值。
具體實(shí)現(xiàn)中,當(dāng)每次檢測到一個線程調(diào)用用于訪問所述目標(biāo)資源的所述運(yùn)行函數(shù)時,通過預(yù)置計(jì)數(shù)器將所述預(yù)設(shè)閾值減1;判斷所述預(yù)設(shè)閾值是否減小至0。例如,將計(jì)數(shù)器的初始值設(shè)置為5,表示最多允許5個線程同時訪問目標(biāo)資源,每次有新線程請求時,將計(jì)數(shù)器的數(shù)值減1,并判斷計(jì)數(shù)器設(shè)置的初始值是否減小至0。
S203,若所述運(yùn)行函數(shù)被加鎖的線程數(shù)量超過所述預(yù)設(shè)閾值,則釋放被加鎖的所有所述運(yùn)行函數(shù),并同步執(zhí)行所釋放的所有所述運(yùn)行函數(shù),以使調(diào)用所述所釋放的運(yùn)行函數(shù)的所有線程同時訪問所述目標(biāo)資源。
例如,當(dāng)計(jì)數(shù)器的數(shù)值減小至0時,同時釋放將要訪問所述目標(biāo)資源的5個線程調(diào)用運(yùn)行函數(shù),執(zhí)行每個線程所調(diào)用的運(yùn)行函數(shù)同時訪問目標(biāo)資源,模擬出5個線程爭搶目標(biāo)資源的場景,從而確定在5個線程爭搶目標(biāo)資源時是否發(fā)生系統(tǒng)崩潰,提高復(fù)現(xiàn)多線程爭搶資源導(dǎo)致系統(tǒng)崩潰的概率。
可選的,將被加鎖的所有所述運(yùn)行函數(shù)中第一個被加鎖的運(yùn)行函數(shù)的加鎖時間點(diǎn)作為起始時間點(diǎn),計(jì)算等待時間;若所述運(yùn)行函數(shù)被加鎖的線程數(shù)量未超過所述預(yù)設(shè)閾值但所述等待時間超過預(yù)設(shè)時間范圍,則釋放被加鎖的所有所述運(yùn)行函數(shù)。
需要說明的是,為了防止將要調(diào)用目標(biāo)資源的線程數(shù)達(dá)不到計(jì)數(shù)器的初始值,可以通過計(jì)時器設(shè)定一個時間范圍,如果在預(yù)設(shè)時間范圍內(nèi)所述運(yùn)行函數(shù)被加鎖的線程數(shù)量超過預(yù)設(shè)閾值,則立刻釋放所有線程所調(diào)用的運(yùn)行函數(shù),如果將要訪問所述目標(biāo)資源的線程數(shù)量未超過預(yù)設(shè)閾值但等待時間超過預(yù)設(shè)時間范圍,也立刻釋放所有線程所調(diào)用的運(yùn)行函數(shù),防止出現(xiàn)線程長時間不能執(zhí)行運(yùn)行函數(shù)的問題,也能起到延遲線程執(zhí)行的作用。
S204,當(dāng)檢測到所述所有線程同時訪問所述目標(biāo)資源發(fā)生系統(tǒng)崩潰時,顯示提示信息,所述提示信息用于提示用戶多線程爭搶資源是否模擬成功。
具體實(shí)現(xiàn)中,如果提示信息為系統(tǒng)發(fā)生崩潰,則說明程序開發(fā)過程中沒有對多線程進(jìn)行同步操作,因此在多線程爭搶資源時發(fā)生系統(tǒng)崩潰,如果提示為系統(tǒng)沒有發(fā)生崩潰,則說明程序開發(fā)過程中已經(jīng)對多線程進(jìn)行了同步操作,因此在多線程爭搶資源時未發(fā)生系統(tǒng)崩潰。
在本發(fā)明實(shí)施例中,首先當(dāng)檢測到線程調(diào)用用于訪問目標(biāo)資源的運(yùn)行函數(shù)時,對所述線程所調(diào)用的所述運(yùn)行函數(shù)進(jìn)行加鎖以停止執(zhí)行所述運(yùn)行函數(shù),并統(tǒng)計(jì)所述運(yùn)行函數(shù)被加鎖的線程數(shù)量;然后確定所述運(yùn)行函數(shù)被加鎖的線程數(shù)量是否超過預(yù)設(shè)閾值;最后若所述運(yùn)行函數(shù)被加鎖的線程數(shù)量超過所述預(yù)設(shè)閾值,則釋放被加鎖的所有所述運(yùn)行函數(shù),并同步執(zhí)行所釋放的所有所述運(yùn)行函數(shù),以使調(diào)用所述所釋放的運(yùn)行函數(shù)的所有線程同時訪問所述目標(biāo)資源,通過在測試過程中模擬多個線程同時爭搶資源,從而提高復(fù)現(xiàn)多線程爭搶資源導(dǎo)致系統(tǒng)崩潰的概率,幫助開發(fā)人員定位到多線程同步的問題。
請參考圖3,圖3是本發(fā)明實(shí)施例提供的一種多線程爭搶資源的模擬裝置的結(jié)構(gòu)示意圖。如圖所示,本發(fā)明實(shí)施例中的裝置包括:
函數(shù)處理模塊301,用于當(dāng)檢測到線程調(diào)用用于訪問目標(biāo)資源的運(yùn)行函數(shù)時,對所述線程所調(diào)用的所述運(yùn)行函數(shù)進(jìn)行加鎖以停止執(zhí)行所述運(yùn)行函數(shù),并統(tǒng)計(jì)所述運(yùn)行函數(shù)被加鎖的線程數(shù)量。
具體實(shí)現(xiàn)中,可以對所述運(yùn)行函數(shù)進(jìn)行Hook以監(jiān)控所述線程是否調(diào)用用于訪問所述目標(biāo)資源的運(yùn)行函數(shù);當(dāng)檢測到線程調(diào)用用于訪問目標(biāo)資源的運(yùn)行函數(shù)時,使用Hook函數(shù)對所述線程所調(diào)用的所述運(yùn)行函數(shù)進(jìn)行加鎖。
可選的,當(dāng)檢測到線程調(diào)用用于訪問目標(biāo)資源的運(yùn)行函數(shù)時,可以首先確定線程所調(diào)用的運(yùn)行函數(shù)是否已加鎖,若線程所調(diào)用的運(yùn)行函數(shù)未加鎖,可以對線程所調(diào)用的運(yùn)行函數(shù)進(jìn)行加鎖,如果線程所調(diào)用的運(yùn)行函數(shù)已加鎖,則檢測是否存在新線程調(diào)用運(yùn)行函數(shù)將要訪問目標(biāo)資源。
需要說明的是,Hook(鉤子)是系統(tǒng)消息處理機(jī)制的一個平臺,應(yīng)用程序可以在上面設(shè)置子程序以監(jiān)視指定函數(shù)的行為動作,而且所監(jiān)視的指定函數(shù)可以是其他線程所創(chuàng)建的,在執(zhí)行處理該指定函數(shù)之前可以先處理線程信息。另外,Hook機(jī)制允許應(yīng)用程序截獲處理Window消息或特定事件,鉤子實(shí)際上是一個處理消息的程序段,通過系統(tǒng)調(diào)用,將Hook函數(shù)掛入系統(tǒng),在執(zhí)行卸載鍵盤布局之前,Hook函數(shù)就先捕獲線程信息,進(jìn)而Hook函數(shù)可以加工處理該線程信息,也可以不作處理而繼續(xù)傳遞該線程信息,還可以強(qiáng)制結(jié)束該線程信息的傳遞。
數(shù)量確定模塊302,用于確定所述運(yùn)行函數(shù)被加鎖的線程數(shù)量是否超過預(yù)設(shè)閾值。
具體實(shí)現(xiàn)中,當(dāng)每次檢測到一個線程調(diào)用用于訪問所述目標(biāo)資源的所述運(yùn)行函數(shù),通過預(yù)置計(jì)數(shù)器將所述預(yù)設(shè)閾值減1;判斷所述預(yù)設(shè)閾值是否減小至0。例如,將計(jì)數(shù)器的初始值設(shè)置為5,表示最多允許5個線程同時訪問目標(biāo)資源,每次有新線程請求時,將計(jì)數(shù)器的數(shù)值減1,并判斷計(jì)數(shù)器設(shè)置的初始值是否減小至0。
資源訪問模塊303,用于若所述運(yùn)行函數(shù)被加鎖的線程數(shù)量超過所述預(yù)設(shè)閾值,則釋放被加鎖的所有所述運(yùn)行函數(shù),并同步執(zhí)行所釋放的所有所述運(yùn)行函數(shù),以使調(diào)用所述所釋放的運(yùn)行函數(shù)的所有線程同時訪問所述目標(biāo)資源。
例如,當(dāng)計(jì)數(shù)器的數(shù)值減小至0時,同時釋放將要訪問所述目標(biāo)資源的5個線程調(diào)用運(yùn)行函數(shù),執(zhí)行每個線程所調(diào)用的運(yùn)行函數(shù)同時訪問目標(biāo)資源,模擬出5個線程爭搶目標(biāo)資源的場景,從而確定在5個線程爭搶目標(biāo)資源時是否發(fā)生系統(tǒng)崩潰,提高復(fù)現(xiàn)多線程爭搶資源導(dǎo)致系統(tǒng)崩潰的概率。
可選的,將被加鎖的所有所述運(yùn)行函數(shù)中第一個被加鎖的運(yùn)行函數(shù)的加鎖時間點(diǎn)作為起始時間點(diǎn),計(jì)算等待時間;若所述運(yùn)行函數(shù)被加鎖的線程數(shù)量未超過所述預(yù)設(shè)閾值但所述等待時間超過預(yù)設(shè)時間范圍,則釋放被加鎖的所有所述運(yùn)行函數(shù)。
需要說明的是,為了防止將要調(diào)用目標(biāo)資源的線程數(shù)達(dá)不到計(jì)數(shù)器的初始值,可以通過計(jì)時器設(shè)定一個時間范圍,如果在預(yù)設(shè)時間范圍內(nèi)所述運(yùn)行函數(shù)被加鎖的線程數(shù)量超過預(yù)設(shè)閾值,則立刻釋放所有線程所調(diào)用的運(yùn)行函數(shù),如果將要訪問所述目標(biāo)資源的線程數(shù)量未超過預(yù)設(shè)閾值但等待時間超過預(yù)設(shè)時間范圍,也立刻釋放所有線程所調(diào)用的運(yùn)行函數(shù),防止出現(xiàn)線程長時間不能執(zhí)行運(yùn)行函數(shù)的問題,也能起到延遲線程執(zhí)行的作用。
可選的,如圖3所示,本發(fā)明實(shí)施例中的裝置還可以包括:
信息顯示模塊304,用于當(dāng)檢測到所述所有線程同時訪問所述目標(biāo)資源發(fā)生系統(tǒng)崩潰時,顯示提示信息,所述提示信息用于提示用戶多線程爭搶資源是否模擬成功。
具體實(shí)現(xiàn)中,如果提示信息為系統(tǒng)發(fā)生崩潰,則說明程序開發(fā)過程中沒有對多線程進(jìn)行同步操作,因此在多線程爭搶資源時發(fā)生系統(tǒng)崩潰,如果提示為系統(tǒng)沒有發(fā)生崩潰,則說明程序開發(fā)過程中已經(jīng)對多線程進(jìn)行了同步操作,因此在多線程爭搶資源時未發(fā)生系統(tǒng)崩潰。
在本發(fā)明實(shí)施例中,首先當(dāng)檢測到線程調(diào)用用于訪問目標(biāo)資源的運(yùn)行函數(shù)時,對所述線程所調(diào)用的所述運(yùn)行函數(shù)進(jìn)行加鎖以停止執(zhí)行所述運(yùn)行函數(shù),并統(tǒng)計(jì)所述運(yùn)行函數(shù)被加鎖的線程數(shù)量;然后確定所述運(yùn)行函數(shù)被加鎖的線程數(shù)量是否超過預(yù)設(shè)閾值;最后若所述運(yùn)行函數(shù)被加鎖的線程數(shù)量超過所述預(yù)設(shè)閾值,則釋放被加鎖的所有所述運(yùn)行函數(shù),并同步執(zhí)行所釋放的所有所述運(yùn)行函數(shù),以使調(diào)用所述所釋放的運(yùn)行函數(shù)的所有線程同時訪問所述目標(biāo)資源,通過在測試過程中模擬多個線程同時爭搶資源,從而提高復(fù)現(xiàn)多線程爭搶資源導(dǎo)致系統(tǒng)崩潰的概率,幫助開發(fā)人員定位到多線程同步的問題。
請參考圖4,圖4是本發(fā)明實(shí)施例提出的另一種多線程爭搶資源的模擬裝置的結(jié)構(gòu)示意圖。如圖所示,該裝置可以包括:至少一個處理器401,例如CPU,至少一個通信接口402,至少一個存儲器403,至少一個總線404。其中,總線404用于實(shí)現(xiàn)這些組件之間的連接通信。其中,本發(fā)明實(shí)施例中裝置的通信接口402是有線發(fā)送端口,也可以為無線設(shè)備,例如包括天線裝置,用于與其他節(jié)點(diǎn)設(shè)備進(jìn)行信令或數(shù)據(jù)的通信。存儲器403可以是高速RAM存儲器,也可以是非不穩(wěn)定的存儲器(non-volatile memory),例如至少一個磁盤存儲器。存儲器403可選的還可以是至少一個位于遠(yuǎn)離前述處理器401的存儲裝置。存儲器403中存儲一組程序代碼,且處理器401用于調(diào)用存儲器中存儲的程序代碼,用于執(zhí)行以下操作:
當(dāng)檢測到線程調(diào)用用于訪問目標(biāo)資源的運(yùn)行函數(shù)時,對所述線程所調(diào)用的所述運(yùn)行函數(shù)進(jìn)行加鎖以停止執(zhí)行所述運(yùn)行函數(shù),并統(tǒng)計(jì)所述運(yùn)行函數(shù)被加鎖的線程數(shù)量;
確定所述運(yùn)行函數(shù)被加鎖的線程數(shù)量是否超過預(yù)設(shè)閾值;
若所述運(yùn)行函數(shù)被加鎖的線程數(shù)量超過所述預(yù)設(shè)閾值,則釋放被加鎖的所有所述運(yùn)行函數(shù),并同步執(zhí)行所釋放的所有所述運(yùn)行函數(shù),以使調(diào)用所述所釋放的運(yùn)行函數(shù)的所有線程同時訪問所述目標(biāo)資源。
其中,處理器401還用于執(zhí)行如下操作步驟:
將被加鎖的所有所述運(yùn)行函數(shù)中第一個被加鎖的運(yùn)行函數(shù)的加鎖時間點(diǎn)作為起始時間點(diǎn),計(jì)算等待時間;
若所述運(yùn)行函數(shù)被加鎖的線程數(shù)量未超過所述預(yù)設(shè)閾值但所述等待時間超過預(yù)設(shè)時間范圍,則釋放被加鎖的所有所述運(yùn)行函數(shù)。
其中,處理器401還用于執(zhí)行如下操作步驟:
對所述運(yùn)行函數(shù)進(jìn)行Hook以監(jiān)控所述線程是否調(diào)用用于訪問所述目標(biāo)資源的運(yùn)行函數(shù);
當(dāng)檢測到線程調(diào)用用于訪問目標(biāo)資源的運(yùn)行函數(shù)時,使用Hook函數(shù)對所述線程所調(diào)用的所述運(yùn)行函數(shù)進(jìn)行加鎖。
其中,處理器401還用于執(zhí)行如下操作步驟:
當(dāng)每次檢測到一個線程調(diào)用用于訪問所述目標(biāo)資源的所述運(yùn)行函數(shù),通過預(yù)置計(jì)數(shù)器將所述預(yù)設(shè)閾值減1;
判斷所述預(yù)設(shè)閾值是否減小至0。
其中,處理器401還用于執(zhí)行如下操作步驟:
當(dāng)檢測到所述所有線程同時訪問所述目標(biāo)資源發(fā)生系統(tǒng)崩潰時,顯示提示信息,所述提示信息用于提示用戶多線程爭搶資源是否模擬成功。
需要說明的是,對于前述的各個方法實(shí)施例,為了簡單描述,故將其都表述為一系列的動作組合,但是本領(lǐng)域技術(shù)人員應(yīng)該知悉,本發(fā)明并不受所描述的動作順序的限制,因?yàn)橐罁?jù)本發(fā)明,某一些步驟可以采用其他順序或者同時進(jìn)行。其次,本領(lǐng)域技術(shù)人員也應(yīng)該知悉,說明書中所描述的實(shí)施例均屬于優(yōu)選實(shí)施例,所涉及的動作和模塊并不一定是本發(fā)明所必須的。
在上述實(shí)施例中,對各個實(shí)施例的描述都各有側(cè)重,某個實(shí)施例中沒有詳細(xì)描述的部分,可以參見其他實(shí)施例的相關(guān)描述。
本領(lǐng)域普通技術(shù)人員可以理解上述實(shí)施例的各種方法中的全部或部分步驟是可以通過程序來指令相關(guān)的硬件來完成,該程序可以存儲于一計(jì)算機(jī)可讀存儲介質(zhì)中,存儲介質(zhì)可以包括:閃存盤、只讀存儲器(英文:Read-Only Memory,簡稱:ROM)、隨機(jī)存取器(英文:Random Access Memory,簡稱:RAM)、磁盤或光盤等。
以上對本發(fā)明實(shí)施例所提供的內(nèi)容下載方法及相關(guān)設(shè)備、系統(tǒng)進(jìn)行了詳細(xì)介紹,本文中應(yīng)用了具體個例對本發(fā)明的原理及實(shí)施方式進(jìn)行了闡述,以上實(shí)施例的說明只是用于幫助理解本發(fā)明的方法及其核心思想;同時,對于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實(shí)施方式及應(yīng)用范圍上均會有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對本發(fā)明的限制。