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