本發(fā)明涉及通信領(lǐng)域,尤其涉及一種防止多線程死鎖的方法及裝置。
背景技術(shù):
現(xiàn)有技術(shù)中,在多線程同步運行的環(huán)境中,當(dāng)一個或多個線程等待系統(tǒng)資源,而資源又被線程本身或者其他線程占用時,就形成了死鎖。由于資源的占用是互斥的,故當(dāng)某個線程提出申請資源后,使得有關(guān)線程在無外力協(xié)助下,永遠(yuǎn)分配不到必需的資源而無法繼續(xù)運行,此時,我們也稱該組線程是不安全的。因而,在多線程同步運行時,如何保障線程安全而不進(jìn)入死鎖,成為一個急需解決的問題。
技術(shù)實現(xiàn)要素:
本發(fā)明為解決現(xiàn)有技術(shù)的不足,提供一種防止多線程解鎖方法及裝置。
一方面,本發(fā)明提供了一種防止多線程死鎖的方法,包括:
當(dāng)sdk接口在主線程狀態(tài)時,執(zhí)行以下操作:
步驟s1:申請全局互斥量的鎖定權(quán),判斷是否申請成功,是則執(zhí)行步驟s2,否則等待第一預(yù)設(shè)時間間隔后繼續(xù)執(zhí)行步驟s1;
步驟s2:判斷目標(biāo)設(shè)備是否已連接,是則執(zhí)行步驟s3;否則連接所述目標(biāo)設(shè)備,并獲取所述目標(biāo)設(shè)備的寫特征和讀特征,執(zhí)行步驟s3;
步驟s3:創(chuàng)建輔助線程;
步驟s4:通過所述寫特征將報文發(fā)送給所述目標(biāo)設(shè)備;
步驟s5:判斷所述目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)是否接收完成,是則執(zhí)行步驟s6,否則等待第二預(yù)設(shè)時間間隔后,繼續(xù)執(zhí)行步驟s5;
步驟s6:釋放所述全局互斥量的鎖定權(quán),返回所述響應(yīng)數(shù)據(jù),結(jié)束;
所述方法還包括:所述輔助線程通過所述讀特征接收所述目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù);
當(dāng)所述sdk接口在子線程狀態(tài)時,執(zhí)行以下操作:
步驟s7:申請全局互斥量的鎖定權(quán);
步驟s8:判斷目標(biāo)設(shè)備是否已連接,是則執(zhí)行步驟s9;否則連接所述目標(biāo)設(shè)備,并獲取所述目標(biāo)設(shè)備的讀特征和寫特征,執(zhí)行步驟s9;
步驟s9:通過所述讀特征接收到所述目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù);
步驟s10:通過所述寫特征將報文發(fā)送給所述目標(biāo)設(shè)備;
步驟s11:判斷響應(yīng)數(shù)據(jù)是否全部接收完成,是則執(zhí)行步驟s12,否則等待第二預(yù)設(shè)時間間隔后,繼續(xù)執(zhí)行步驟s11;
步驟s12:釋放所述全局互斥量的鎖定權(quán),返回所述響應(yīng)數(shù)據(jù),結(jié)束。
可選地,所述方法還包括:判斷所述sdk接口所在的狀態(tài)類型,如為主線程狀態(tài),則執(zhí)行步驟s1;如為子線程狀態(tài),則執(zhí)行步驟s7。
可選地,所述判斷所述sdk接口所在的狀態(tài)類型,具體為:
調(diào)用第一預(yù)設(shè)函數(shù)接口,并判斷返回值是否為第一預(yù)設(shè)值,是則判定所述sdk接口所在的狀態(tài)類型為主線程狀態(tài);否則,判定所述sdk接口所在的狀態(tài)類型為子線程狀態(tài)。
可選地,所述步驟s1之前,還包括:
步驟1:判斷是否存在全局互斥量,是則執(zhí)行步驟s1;否則創(chuàng)建所述全局互斥量,執(zhí)行步驟s1;
所述步驟s7之前,還包括:
步驟2:判斷是否存在所述全局互斥量,是則執(zhí)行步驟s7;否則創(chuàng)建所述全局互斥量,執(zhí)行步驟s7。
可選地,所述步驟s1中,所述申請全局互斥量的鎖定權(quán),判斷是否申請成功,具體為:
調(diào)用第二函數(shù)接口打開全局互斥量,申請所述全局互斥量的鎖定權(quán),并判斷所述第二函數(shù)接口的返回值的類型,如所述返回值為第二預(yù)設(shè)值,則判定申請成功;如所述返回值為第三預(yù)設(shè)值,則判定申請失敗。
可選地,所述步驟s7中,所述申請全局互斥量的鎖定權(quán),具體為:
調(diào)用第八函數(shù)接口打開全局互斥量,申請所述全局互斥量的鎖定權(quán)。
可選地,所述步驟s3,具體為:調(diào)用第二預(yù)設(shè)函數(shù)接口創(chuàng)建輔助線程。
可選地,所述通過所述寫特征將報文發(fā)送給所述目標(biāo)設(shè)備,具體為:
調(diào)用第三預(yù)設(shè)函數(shù)接口通過所述寫特征將報文發(fā)送給所述目標(biāo)設(shè)備。
可選地,所述通過所述讀特征接收所述目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)之前,還包括:將接收標(biāo)識復(fù)位;
通過所述讀特征將所述目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)全部接收完成時,還包括:將所述接收標(biāo)識置位;
所述判斷響應(yīng)數(shù)據(jù)是否接收完成,具體為:判斷所述接收標(biāo)識是否置位,是則判定響應(yīng)數(shù)據(jù)接收完成,否則判定響應(yīng)數(shù)據(jù)未接收完成。
可選地,所述釋放所述全局互斥量的鎖定權(quán),具體為:調(diào)用第九函數(shù)接口釋放所述全局互斥量的鎖定權(quán)。
另一方面,本發(fā)明提供了一種防止多線程死鎖的裝置,包括:
第一申請模塊,用于當(dāng)sdk接口在主線程狀態(tài)時,申請全局互斥量的鎖定權(quán);
第一判斷模塊,用于判斷所述第一申請模塊是否申請成功;
所述第一申請模塊,還用于當(dāng)所述第一判斷模塊判斷出所述第一申請模塊申請不成功時,等待第一預(yù)設(shè)時間間隔后繼續(xù)申請全局互斥量的鎖定權(quán);
第二判斷模塊,用于當(dāng)所述第一判斷模塊判斷出所述第一申請模塊申請成功時,判斷目標(biāo)設(shè)備是否已連接;
第一連接模塊,用于當(dāng)所述第二判斷模塊判斷出目標(biāo)設(shè)備未連接時,連接所述目標(biāo)設(shè)備;
第一獲取模塊,用于在所述第一連接模塊連接所述目標(biāo)設(shè)備之后,獲取所述目標(biāo)設(shè)備的寫特征和讀特征;
第一創(chuàng)建模塊,用于當(dāng)所述第二判斷模塊判斷出目標(biāo)設(shè)備已連接時,創(chuàng)建輔助線程;還用于在所述第一獲取模塊獲取所述目標(biāo)設(shè)備的寫特征和讀特征之后,創(chuàng)建輔助線程;
第一發(fā)送模塊,用于通過所述第一獲取模塊獲取到的寫特征將報文發(fā)送給所述目標(biāo)設(shè)備;
第三判斷模塊,用于判斷第一接收模塊是否將所述目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)接收完成;還用于當(dāng)自身判斷出第一接收模塊未將所述目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)接收完成時,等待第二預(yù)設(shè)時間間隔后,繼續(xù)判斷所述第一接收模塊是否將所述目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)接收完成;
釋放模塊,用于當(dāng)所述第三判斷模塊判斷出所述第一接收模塊將所述目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)接收完成時,釋放所述全局互斥量的鎖定權(quán);
第二發(fā)送模塊,用于當(dāng)所述釋放模塊釋放所述全局互斥量的鎖定權(quán)之后,返回所述第一接收模塊接收到的響應(yīng)數(shù)據(jù);
所述第一接收模塊,用于所述輔助線程通過所述第一獲取模塊獲取的讀特征接收所述目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù);
第二申請模塊,用于當(dāng)sdk接口在子線程狀態(tài)時,申請全局互斥量的鎖定權(quán);
第四判斷模塊,用于在所述第二申請模塊申請全局互斥量的鎖定權(quán)之后,判斷目標(biāo)設(shè)備是否已連接;
第二連接模塊,用于當(dāng)所述第四判斷模塊判斷出目標(biāo)設(shè)備未連接時,連接所述目標(biāo)設(shè)備;
第二獲取模塊,用于在第二連接模塊連接所述目標(biāo)設(shè)備之后,獲取所述目標(biāo)設(shè)備的讀特征和寫特征;
第二接收模塊,用于通過所述第二獲取模塊獲取到的讀特征接收所述目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù);
所述第一發(fā)送模塊,還用于通過所述第二獲取模塊獲取到的寫特征將報文發(fā)送給所述目標(biāo)設(shè)備;
所述第三判斷模塊,還用于判斷所述第二接收模塊是否將所述目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)接收完成;還用于當(dāng)自身判斷出所述第二接收模塊未將所述目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)接收完成時,等待第二預(yù)設(shè)時間間隔后繼續(xù)判斷所述第二接收模塊是否將所述目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)接收完成;
所述釋放模塊,還用于當(dāng)所述第三判斷模塊判斷出所述第二接收模塊將所述目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)接收完成時,釋放所述全局互斥量的鎖定權(quán)。
可選地,所述裝置還包括:第五判斷模塊;
所述第五判斷模塊,用于判斷所述sdk接口所在的狀態(tài)類型;
所述第一申請模塊,具體用于:當(dāng)所述第五判斷模塊判斷出所述sdk接口所在的狀態(tài)類型為主線程狀態(tài)時,申請全局互斥量的鎖定權(quán);
所述第二申請模塊,具體用于:當(dāng)所述第五判斷模塊判斷出所述sdk接口所在的狀態(tài)類型為子線程狀態(tài)時,申請全局互斥量的鎖定權(quán)。
可選地,所述第五判斷模塊,具體用于:調(diào)用第一預(yù)設(shè)函數(shù)接口,并判斷返回值是否為第一預(yù)設(shè)值,是則判定所述sdk接口所在的狀態(tài)類型為主線程狀態(tài);否則,判定所述sdk接口所在的狀態(tài)類型為子線程狀態(tài)。
可選地,所述裝置還包括:第六判斷模塊、第二創(chuàng)建模塊、第七判斷模塊和第三創(chuàng)建模塊;
所述第六判斷模塊,用于在所述第一申請模塊申請全局互斥量的鎖定權(quán)之前,判斷是否存在全局互斥量;
所述第二創(chuàng)建模塊,用于當(dāng)所述第六判斷模塊判斷出不存在全局互斥量時,創(chuàng)建全局互斥量;
所述第一申請模塊,具體用于:當(dāng)所述第六判斷模塊判斷出存在全局互斥量時,申請全局互斥量的鎖定權(quán);還用于在所述第二創(chuàng)建模塊創(chuàng)建全局互斥量之后,申請全局互斥量的鎖定權(quán);
所述第七判斷模塊,用于在所述第二申請模塊申請全局互斥量的鎖定權(quán)之前,判斷是否存在全局互斥量;
所述第三創(chuàng)建模塊,用于當(dāng)所述第七判斷模塊判斷出不存在全局互斥量時,創(chuàng)建全局互斥量;
所述第二申請模塊,具體用于:當(dāng)所述第七判斷模塊判斷出存在全局互斥量時,申請全局互斥量的鎖定權(quán);還用于在所述第三創(chuàng)建模塊創(chuàng)建全局互斥量之后,申請全局互斥量的鎖定權(quán)。
可選地,所述第一申請模塊,具體用于:調(diào)用第二函數(shù)接口打開全局互斥量,申請所述全局互斥量的鎖定權(quán);
所述第一判斷模塊,具體用于:判斷所述第二函數(shù)接口的返回值的類型,如所述返回值為第二預(yù)設(shè)值,則判定申請成功;如所述返回值為第三預(yù)設(shè)值,則判定申請失敗。
可選地,所述第二申請模塊,具體用于:調(diào)用第八函數(shù)接口打開全局互斥量,申請所述全局互斥量的鎖定權(quán)。
可選地,所述第一創(chuàng)建模塊,具體用于:調(diào)用第二預(yù)設(shè)函數(shù)接口創(chuàng)建輔助線程。
可選地,所述第一發(fā)送模塊,具體用于:調(diào)用第三預(yù)設(shè)函數(shù)接口通過所述寫特征將報文發(fā)送給所述目標(biāo)設(shè)備。
可選地,所述裝置還包括:復(fù)位模塊和置位模塊;
所述復(fù)位模塊,用于在所述第一接收模塊接收所述目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)之前,將接收標(biāo)識復(fù)位;還用于在所述第二接收模塊通過所述第二獲取模塊獲取到的讀特征接收所述目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)之前,將接收標(biāo)識復(fù)位;
所述置位模塊,用于在所述第一接收模塊將所述目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)接收完成時,將所述接收標(biāo)識置位;還用于在所述第二接收模塊通過所述第二獲取模塊獲取到的讀特征將所述目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)全部接收完成時,將所述接收標(biāo)識置位;
所述第三判斷模塊,具體用于:判斷所述接收標(biāo)識是否置位,是則判定響應(yīng)數(shù)據(jù)全部接收完成,否則判定響應(yīng)數(shù)據(jù)未全部接收完成。
可選地,所述釋放模塊,具體用于:調(diào)用第九函數(shù)接口釋放所述全局互斥量的鎖定權(quán)。
本發(fā)明與現(xiàn)有技術(shù)相比,具有以下優(yōu)點:
本發(fā)明的技術(shù)方案,在多線程同步運行的環(huán)境中,可以使各線程有效運行而不進(jìn)入死鎖,保障了線程安全。
附圖說明
圖1和圖2為本發(fā)明實施例一提供的一種防止多線程死鎖的方法流程圖;
圖3為本發(fā)明實施例二提供的一種ios系統(tǒng)中防止多線程死鎖的方法流程圖;
圖4為本發(fā)明實施例三提供的一種android系統(tǒng)中防止多線程死鎖的方法流程圖;
圖5為本發(fā)明實施例四提供的一種防止多線程死鎖的裝置的模塊組成框圖。
具體實施方式
下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進(jìn)行清楚、完整的描述,顯然,所描述的實施例僅僅是本發(fā)明的一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域技術(shù)人員在沒有做出創(chuàng)造性勞動的前提下所獲得的所有其他實施例,都屬于本發(fā)明保護(hù)的范圍。
本發(fā)明中的目標(biāo)設(shè)備可以為藍(lán)牙設(shè)備、音頻設(shè)備等。
實施例一
本發(fā)明實施例一提供一種防止多線程死鎖的方法,包括:
當(dāng)sdk接口在主線程狀態(tài)時,如圖1所示,執(zhí)行以下操作:
步驟101:申請全局互斥量的鎖定權(quán),判斷是否申請成功,是則執(zhí)行步驟102,否則等待第一預(yù)設(shè)時間間隔后,繼續(xù)執(zhí)行步驟101;
步驟102:判斷目標(biāo)設(shè)備是否已連接,是則執(zhí)行步驟103;否則連接目標(biāo)設(shè)備,并獲取目標(biāo)設(shè)備的寫特征和讀特征,執(zhí)行步驟103;
步驟103:創(chuàng)建輔助線程;
步驟104:通過獲取到的寫特征將報文發(fā)送給目標(biāo)設(shè)備;
步驟105:判斷目標(biāo)藍(lán)牙設(shè)備返回的響應(yīng)數(shù)據(jù)是否接收完成,是則執(zhí)行步驟106,否則等待第二預(yù)設(shè)時間間隔后,繼續(xù)執(zhí)行步驟105;
步驟106:釋放全局互斥量的鎖定權(quán),返回響應(yīng)數(shù)據(jù),結(jié)束;
所述方法還包括:輔助線程通過獲取到的讀特征接收目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù);
當(dāng)sdk接口在子線程狀態(tài)時,如圖2所示,執(zhí)行以下操作:
步驟107:申請全局互斥量的鎖定權(quán);
步驟108:判斷目標(biāo)設(shè)備是否已連接,是則執(zhí)行步驟109;否則連接目標(biāo)設(shè)備,并獲取目標(biāo)設(shè)備的讀特征和寫特征,執(zhí)行步驟109;
步驟109:通過獲取到的讀特征接收目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù);
步驟110:通過獲取到的寫特征將報文發(fā)送給目標(biāo)設(shè)備;
步驟111:判斷響應(yīng)數(shù)據(jù)是否接收完成,是則執(zhí)行步驟112,否則等待第二預(yù)設(shè)時間間隔后,繼續(xù)執(zhí)行步驟111;
步驟112:釋放全局互斥量的鎖定權(quán),返回響應(yīng)數(shù)據(jù),結(jié)束。
本實施例中的方法,還包括:判斷sdk接口所在的狀態(tài)類型,如為主線程狀態(tài),則執(zhí)行步驟101;如為子線程狀態(tài),則執(zhí)行步驟107;
其中,判斷sdk接口所在的狀態(tài)類型,具體為:調(diào)用第一預(yù)設(shè)函數(shù)接口并判斷返回值是否為第一預(yù)設(shè)值,是則判定sdk接口所在的狀態(tài)類型為主線程狀態(tài);否則,判定sdk接口所在的狀態(tài)類型為子線程狀態(tài)。
在本實施例中,如移動設(shè)備的操作系統(tǒng)為ios系統(tǒng),則第一預(yù)設(shè)函數(shù)接口具體為第一函數(shù)接口,第一函數(shù)接口具體為:[[nsthreadcurrentthread]ismainthread];
在本實施例中,如移動設(shè)備的操作系統(tǒng)為android系統(tǒng),則第一預(yù)設(shè)函數(shù)接口具體為第十函數(shù)接口和第十一函數(shù)接口,其中,第十函數(shù)接口具體為:looper.mylooper(),第十一函數(shù)接口具體為:looper.getmainlooper();
需要說明地,當(dāng)?shù)谑瘮?shù)接口和第十一函數(shù)接口的返回值均為第一預(yù)設(shè)值時,判定所在的狀態(tài)類型為主線程狀態(tài);
優(yōu)選地,在本實施例中,第一預(yù)設(shè)值為true。
在本實施例中,步驟101之前,還包括:
步驟1:判斷是否存在所述全局互斥量,是則執(zhí)行步驟101;否則創(chuàng)建所述全局互斥量,執(zhí)行步驟101;
步驟107之前,還包括:
步驟2:判斷是否存在所述全局互斥量,是則執(zhí)行步驟107;否則創(chuàng)建所述全局互斥量,執(zhí)行步驟107。
本實施例步驟101中,申請全局互斥量的鎖定權(quán),判斷是否申請成功,具體為:
調(diào)用第二函數(shù)接口打開全局互斥量,申請全局互斥量的鎖定權(quán),并判斷第二函數(shù)接口的返回值的類型,如返回值為第二預(yù)設(shè)值,則判定申請成功;如返回值為第三預(yù)設(shè)值,則判定申請失敗。
在本實施例中,第二函數(shù)接口具體為:intpthread_mutex_trylock(pthread_mutex_t*);其中參數(shù)pthread_mutex_t*為全局互斥量;
優(yōu)選地,在本實施例中,第二預(yù)設(shè)值為0,第三預(yù)設(shè)值為ebusy。
本實施例步驟107中,申請全局互斥量的鎖定權(quán),具體為:調(diào)用第八函數(shù)接口打開全局互斥量,申請全局互斥量的鎖定權(quán)。
在本實施例中,第八函數(shù)接口具體為:intpthread_mutex_lock(pthread_mutex_t*mutex);其中,參數(shù)pthread_mutex_t*mutex為全局互斥量。
進(jìn)一步地,在本實施例步驟103中,創(chuàng)建輔助線程,具體為:調(diào)用第二預(yù)設(shè)函數(shù)接口創(chuàng)建輔助線程;
具體地,如移動設(shè)備的操作系統(tǒng)為ios系統(tǒng),則第二預(yù)設(shè)函數(shù)接口具體為第六函數(shù)接口,第六函數(shù)接口具體為:dispatch_async(dispatch_get_global_queue(0,0),^{code});
如移動設(shè)備的的操作系統(tǒng)為android系統(tǒng),則第二預(yù)設(shè)函數(shù)接口具體為第十五函數(shù)接口,第十五函數(shù)接口具體為:newthread(code)。
在本實施例中,所述通過獲取到的寫特征將報文發(fā)送給目標(biāo)設(shè)備,具體為:調(diào)用第三預(yù)設(shè)函數(shù)接口通過獲取到的寫特征將報文發(fā)送給目標(biāo)設(shè)備。
具體地,如移動設(shè)備的系統(tǒng)為ios系統(tǒng),則第三預(yù)設(shè)函數(shù)接口具體為第七函數(shù)接口,第七函數(shù)接口為:-(void)writevalue:(nsdata*)dataforcharacteristic:(cbcharacteristic*)characteristictype:(cbcharacteristicwritetype)type;
如移動設(shè)備的系統(tǒng)為android系統(tǒng),則第三預(yù)設(shè)函數(shù)接口具體為第十六函數(shù)接口和第十七函數(shù)接口,其中,第十六函數(shù)接口為publicbooleansetvalue(byte[]value),第十七函數(shù)接口為publicbooleanwritecharacteristic(bluetoothgattcharacteristiccharacteristic);
具體地,調(diào)用第十六函數(shù)接口將報文寫至獲取到的寫特征中,調(diào)用第十七函數(shù)接口通過寫特征將報文發(fā)送給目標(biāo)設(shè)備。
更進(jìn)一步地,在本實施例中,所述通過獲取到的讀特征接收目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)之之前,還包括:將接收標(biāo)識復(fù)位;
通過獲取到的讀特征將目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)接收完成時,還包括:將接收標(biāo)識置位;
對應(yīng)地,判斷響應(yīng)數(shù)據(jù)是否接收完成,具體為,判斷接收標(biāo)識是否置位,是則判定響應(yīng)數(shù)據(jù)接收完成,否則判定響應(yīng)數(shù)據(jù)未接收完成。
在本實施例中,所述釋放所述全局互斥量的鎖定權(quán),具體為:調(diào)用第九函數(shù)接口釋放所述全局互斥量的鎖定權(quán);
在本實施例中,第九函數(shù)接口具體為intpthread_mutex_unlock(pthread_mutex_t*mutex)。
需說明地,在本實施例中,當(dāng)上層應(yīng)用調(diào)用sdk接口時,將報文傳入sdk接口;對應(yīng)地,上述返回響應(yīng)數(shù)據(jù),具體為:返回響應(yīng)數(shù)據(jù)給上層應(yīng)用。
實施例二
本發(fā)明實施例二提供一種ios系統(tǒng)中防止多線程死鎖的方法,當(dāng)sdk接口被調(diào)用時,如圖3所示,執(zhí)行以下操作:
步驟201:判斷所在的狀態(tài)類型,如為主線程狀態(tài),則執(zhí)行步驟202;如為子線程狀態(tài),則執(zhí)行步驟211;
具體地,調(diào)用第一函數(shù)接口,并判斷返回值的類型,如返回值為第一預(yù)設(shè)值,則判定所在的狀態(tài)類型為主線程狀態(tài);否則,判定所在的狀態(tài)類型為子線程狀態(tài);
在本實施例中,第一函數(shù)接口具體為:[[nsthreadcurrentthread]ismainthread];
優(yōu)選地,第一預(yù)設(shè)值為true。
步驟202:判斷是否存在全局互斥量,是則執(zhí)行步驟204,否則執(zhí)行步驟203;
步驟203:創(chuàng)建全局互斥量,執(zhí)行步驟204;
步驟204:打開全局互斥量,申請全局互斥量的鎖定權(quán),并判斷是否申請成功,是則執(zhí)行步驟205;否則等待第一預(yù)設(shè)時間間隔后,繼續(xù)執(zhí)行步驟204;
具體地,調(diào)用第二函數(shù)接口打開全局互斥量,申請全局互斥量的鎖定權(quán),并判斷第二函數(shù)接口返回值的類型,如返回值為第二預(yù)設(shè)值,則判定申請成功;如返回值為第三預(yù)設(shè)值,則判定申請失敗;
在本實施例中,第二函數(shù)接口具體為:intpthread_mutex_trylock(pthread_mutex_t*);其中參數(shù)pthread_mutex_t*為全局互斥量。
優(yōu)選地,在本實施例中,第二預(yù)設(shè)值為0,第三預(yù)設(shè)值為ebusy,第一預(yù)設(shè)時間間隔優(yōu)選為1s。
步驟205:判斷目標(biāo)設(shè)備是否已連接,是則執(zhí)行步驟207;否則執(zhí)行步驟206;
具體地,調(diào)用第三函數(shù)接口,并判斷接收到的返回值是否為第四預(yù)設(shè)值,是則判定目標(biāo)設(shè)備已連接;否則判定目標(biāo)設(shè)備未連接;
在本實施例中,第三函數(shù)接口具體為:[peripheralstate]。
優(yōu)選地,第四預(yù)設(shè)值為cbperipheralstateconnected。
步驟206:連接目標(biāo)設(shè)備,并獲取目標(biāo)設(shè)備的讀特征和寫特征;
具體地,調(diào)用第四函數(shù)接口連接目標(biāo)設(shè)備,并調(diào)用第五函數(shù)接口獲取目標(biāo)設(shè)備的服務(wù)中的所有特征,從獲取到的所有特征中查找到讀特征和寫特征;
在本實施例中,第四函數(shù)接口具體為:-(void)connectperipheral:(cbperipheral*)peripheraloptions:(nullablensdictionary<nsstring*,id>*)options;
第五函數(shù)接口具體為:-(void)peripheral:(cbperipheral*)peripheraldiddiscovercharacteristicsforservice:(cbservice*)serviceerror:(nserror*)error。
在本實施例中,目標(biāo)設(shè)備中含有多個服務(wù),每個服務(wù)對應(yīng)多個特征,其中讀特征又稱接收特征,通過讀特征接收目標(biāo)設(shè)備返回的數(shù)據(jù);寫特征又稱發(fā)送特征,通過寫特征向目標(biāo)設(shè)備發(fā)送數(shù)據(jù)。
步驟207:將接收標(biāo)識復(fù)位;
具體地,將接收標(biāo)識設(shè)置為0。
步驟208:創(chuàng)建輔助線程,所述輔助線程通過獲取到的讀特征等待并接收目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù);
具體地,調(diào)用第六函數(shù)接口創(chuàng)建輔助線程,所述輔助線程通過獲取到的讀特征接收目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù);
在本實施例中,第六函數(shù)接口具體為:dispatch_async(dispatch_get_global_queue(0,0),^{code});其中,第一個參數(shù)dispatch_get_global_queue(0,0)為創(chuàng)建的輔助線程,第二個參數(shù)code為輔助線程執(zhí)行的代碼片段;
步驟209:通過獲取到的寫特征將報文發(fā)送給目標(biāo)設(shè)備;
具體地,調(diào)用第七函數(shù)接口通過獲取到的寫特征將報文發(fā)送給目標(biāo)設(shè)備;
在本實施例中,第七函數(shù)接口具體為:
-(void)writevalue:(nsdata*)dataforcharacteristic:(cbcharacteristic*)characteristictype:(cbcharacteristicwritetype)type;其中,第一個參數(shù)data具體為報文,第二個參數(shù)cbcharacteristicwritetype具體為寫特征。
例如,在本實施例中,報文為:<?xmlversion="1.0"encoding="utf-8"?><t><d><m><k>456</k><v>123\n</v></m><m><k>金額</k><v>123.23\n</v><k>流水號</k><v>123456789012345600000000\n</v></m></d><e><m><k>轉(zhuǎn)賬人</k><v>12345678</v></m></e><f>hahaha</f></t>。
進(jìn)一步地,在本實施例中,當(dāng)目標(biāo)設(shè)備接收到報文時,根據(jù)報文執(zhí)行相應(yīng)操作得到操作結(jié)果,根據(jù)操作結(jié)果組織響應(yīng)數(shù)據(jù)并返回。
步驟210:當(dāng)通過獲取到的讀特征將目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)接收完成時,將接收標(biāo)識置位,執(zhí)行步驟220;
在本實施例中,將接收標(biāo)識置位,具體為:將接收標(biāo)識設(shè)置為1。
步驟211:判斷是否存在全局互斥量,是則執(zhí)行步驟213,否則執(zhí)行步驟212;
步驟212:創(chuàng)建全局互斥量,執(zhí)行步驟213;
步驟213:打開全局互斥量,申請全局互斥量的鎖定權(quán);
具體地,調(diào)用第八函數(shù)接口打開全局互斥量,申請全局互斥量的鎖定權(quán);
在本實施例中,第八函數(shù)接口具體為:intpthread_mutex_lock(pthread_mutex_t*mutex);其中,參數(shù)pthread_mutex_t*mutex為全局互斥量。
步驟214:判斷目標(biāo)設(shè)備是否已連接,是則執(zhí)行步驟216;否則執(zhí)行步驟215;
本步驟中,判斷目標(biāo)設(shè)備是否已連接的方法,同步驟205中所述的方法相同,在此不再贅述。
步驟215:連接目標(biāo)設(shè)備,并獲取目標(biāo)設(shè)備的讀特征和寫特征;
具體地,調(diào)用上述第四函數(shù)接口連接目標(biāo)設(shè)備,并調(diào)用上述第五函數(shù)接口獲取目標(biāo)設(shè)備的讀特征和寫特征。
步驟216:將接收標(biāo)識復(fù)位;
具體地,將接收標(biāo)識設(shè)置為0。
步驟217:通過獲取到的讀特征等待并接收目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù);
步驟218:通過獲取到的寫特征將報文發(fā)送給目標(biāo)設(shè)備;
具體地,調(diào)用上述第七函數(shù)接口通過獲取到的寫特征將報文發(fā)送給目標(biāo)設(shè)備。
步驟219:當(dāng)通過獲取到的讀特征將目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)接收完成時,將接收標(biāo)識置位,執(zhí)行步驟220;
在本實施例中,將接收標(biāo)識置位,具體為:將接收標(biāo)識設(shè)置為1。
步驟220:釋放全局互斥量的鎖定權(quán),返回接收到的響應(yīng)數(shù)據(jù),結(jié)束。
具體地,調(diào)用第九函數(shù)接口釋放全局互斥量的鎖定權(quán);
在本實施例中,第九函數(shù)接口具體為:intpthread_mutex_unlock(pthread_mutex_t*mutex);其中,參數(shù)pthread_mutex_t*mutex為全局互斥量。
需說明地,本實施例中,上層應(yīng)用調(diào)用sdk接口時,將報文傳入sdk接口;對應(yīng)地,返回接收到的響應(yīng)數(shù)據(jù),具體為:返回接收到的響應(yīng)數(shù)據(jù)給上層應(yīng)用。
進(jìn)一步地,在本實施例中,當(dāng)通過獲取到的讀特征將目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)全部接收完成時,還包括:根據(jù)接收到的響應(yīng)數(shù)據(jù)判斷操作是否成功,是則顯示成功信息,否則顯示失敗信息。
實施例三
本發(fā)明實施例三提供一種android系統(tǒng)中防止多線程死鎖的方法,當(dāng)sdk接口被調(diào)用時,如圖4所示,執(zhí)行以下操作:
步驟301:判斷所在的狀態(tài)類型,如為主線程狀態(tài),則執(zhí)行步驟302;如為子線程狀態(tài),則執(zhí)行步驟311;
具體地,調(diào)用第十函數(shù)接口和第十一函數(shù)接口,并判斷第十函數(shù)接口的返回值與第十一函數(shù)接口的返回值是否均為第一預(yù)設(shè)值,是則判定所在的狀態(tài)類型為主線程狀態(tài);否則,判定所在的狀態(tài)類型為子線程狀態(tài);
在本實施例中,第十函數(shù)接口具體為:looper.mylooper();第十一函數(shù)接口具體為:looper.getmainlooper();第一預(yù)設(shè)值優(yōu)選為true。
步驟302:判斷是否存在全局互斥量,是則執(zhí)行步驟304;否則執(zhí)行步驟303;
步驟303:創(chuàng)建全局互斥量,執(zhí)行步驟304;
步驟304:打開全局互斥量,申請全局互斥量的鎖定權(quán),并判斷是否申請成功,則執(zhí)行步驟305;否則等待第一預(yù)設(shè)時間間隔后繼續(xù)執(zhí)行步驟304;
具體地,調(diào)用第二函數(shù)接口打開全局互斥量,申請全局互斥量的鎖定權(quán),并判斷第二函數(shù)接口返回值的類型,如返回值為第二預(yù)設(shè)值,則判定申請成功;如返回值為第三預(yù)設(shè)值,則判定申請失?。?/p>
在本實施例中,第二函數(shù)接口具體為:intpthread_mutex_trylock(pthread_mutex_t*);其中參數(shù)pthread_mutex_t*為全局互斥量;
優(yōu)選地,在本實施例中,第二預(yù)設(shè)值為0,第三預(yù)設(shè)值為ebusy,第一預(yù)設(shè)時間間隔為1s。
步驟305:判斷目標(biāo)設(shè)備是否已連接,是則執(zhí)行步驟307;否則執(zhí)行步驟306;
具體地,調(diào)用第十二函數(shù)接口,并判斷接收到的返回值是否為第五預(yù)設(shè)值,是則判定目標(biāo)設(shè)備已連接,否則判定目標(biāo)設(shè)備未連接;
在本實施例中,第十二函數(shù)接口具體為:adapter.getprofileconnectionstate(bluetoothprofile.headset);
優(yōu)選地,第五預(yù)設(shè)值為bluetoothprofile.state_connected。
步驟306:連接目標(biāo)設(shè)備,并獲取目標(biāo)設(shè)備的讀特征和寫特征;
具體地,調(diào)用第十三函數(shù)接口連接目標(biāo)設(shè)備,并分別根據(jù)讀特征和寫特征的uuid調(diào)用第十四函數(shù)接口獲取目標(biāo)設(shè)備的讀特征和寫特征;
在本實施例中,第十三函數(shù)接口具體為:publicbluetoothgattconnectgatt(contextcontext,booleanautoconnect,bluetoothgattcallbackcallback);
第十四函數(shù)接口具體為:publicbluetoothgattcharacteristicgetcharacteristic(uuiduuid)。
在本實施例中,目標(biāo)設(shè)備中含有多個服務(wù),每個服務(wù)對應(yīng)多個特征,其中讀特征又稱接收特征,通過讀特征接收目標(biāo)設(shè)備返回的數(shù)據(jù);寫特征又稱發(fā)送特征,通過寫特征向目標(biāo)設(shè)備發(fā)送數(shù)據(jù)。
步驟307:將接收標(biāo)識復(fù)位;
具體地,將接收標(biāo)識設(shè)置為0。
步驟308:創(chuàng)建輔助線程,所述輔助線程通過獲取到的讀特征等待并接收目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù);
具體地,調(diào)用第十五函數(shù)接口創(chuàng)建輔助線程,所述輔助線程調(diào)用第七函數(shù)接口接收目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù);
在本實施例中,第十五函數(shù)接口具體為:newthread(code),其中參數(shù)code表示輔助線程執(zhí)行的代碼片段;
步驟309:通過獲取到的寫特征將報文發(fā)送給目標(biāo)設(shè)備;
具體地,調(diào)用第十六函數(shù)接口將報文寫至寫特征中,并調(diào)用第十七函數(shù)接口通過寫特征將報文發(fā)送給目標(biāo)設(shè)備;
在本實施例中,第十六函數(shù)接口具體為:publicbooleansetvalue(byte[]value)
第十七函數(shù)接口具體為:publicbooleanwritecharacteristic(bluetoothgattcharacteristiccharacteristic);
例如,在本實施例中,報文為:<?xmlversion="1.0"encoding="utf-8"?><t><d><m><k>456</k><v>123\n</v></m><m><k>金額</k><v>123.23\n</v><k>流水號</k><v>123456789012345600000000\n</v></m></d><e><m><k>轉(zhuǎn)賬人</k><v>12345678</v></m></e><f>hahaha</f></t>。
進(jìn)一步地,在本實施例中,當(dāng)目標(biāo)設(shè)備接收到報文時,根據(jù)報文執(zhí)行相應(yīng)操作得到操作結(jié)果,根據(jù)操作結(jié)果組織響應(yīng)數(shù)據(jù)并返回。
步驟310:當(dāng)通過獲取到的讀特征將目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)接收完成時,將接收標(biāo)識置位,執(zhí)行步驟320;
在本實施例中,將接收標(biāo)識置位,具體為:將接收標(biāo)識設(shè)置為1。
步驟311:判斷是否存在全局互斥量,是則執(zhí)行步驟313,否則執(zhí)行步驟312;
步驟312:創(chuàng)建全局互斥量,執(zhí)行步驟313;
步驟313:打開全局互斥量,并獲取全局互斥量的鎖定權(quán);
具體地,調(diào)用第八函數(shù)接口打開全局互斥量,并獲取全局互斥量的鎖定權(quán);
在本實施例中,第八函數(shù)接口具體為:intpthread_mutex_lock(pthread_mutex_t*mutex);其中,參數(shù)pthread_mutex_t*mutex為全局互斥量。
步驟314:判斷目標(biāo)設(shè)備是否已連接,是則執(zhí)行步驟316;否則執(zhí)行步驟315;
本步驟中,判斷目標(biāo)設(shè)備是否已連接的方法,同步驟305中所述的方法相同,在此不再贅述。
步驟315:連接目標(biāo)設(shè)備,并獲取目標(biāo)設(shè)備的讀特征和寫特征;
具體地,調(diào)用上述第十三函數(shù)接口連接目標(biāo)設(shè)備,并調(diào)用上述第十四函數(shù)接口獲取目標(biāo)設(shè)備的讀特征和寫特征。
步驟316:將接收標(biāo)識復(fù)位;
具體地,將接收標(biāo)識設(shè)置為0。
步驟317:通過獲取到的讀特征等待并接收目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù);
步驟318:通過獲取到的寫特征將報文發(fā)送給目標(biāo)設(shè)備;
本步驟的實現(xiàn)方法同步驟309的實現(xiàn)方法相同,在此不再贅述。
步驟319:當(dāng)通過獲取到的讀特征將目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)接收完成時,將接收標(biāo)識置位,執(zhí)行步驟320;
在本實施例中,將接收標(biāo)識置位,具體為:將接收標(biāo)識設(shè)置為1。
步驟320:釋放全局互斥量的鎖定權(quán),返回接收到的響應(yīng)數(shù)據(jù),結(jié)束。
具體地,調(diào)用第九函數(shù)接口釋放全局互斥量的鎖定權(quán);
在本實施例中,第九函數(shù)接口具體為:intpthread_mutex_unlock(pthread_mutex_t*mutex);其中,參數(shù)pthread_mutex_t*mutex為全局互斥量。
需說明地,在本實施例中,上層應(yīng)用調(diào)用sdk接口時,將報文傳入sdk接口;對應(yīng)地,返回接收到的響應(yīng)數(shù)據(jù),具體為:返回接收到的響應(yīng)數(shù)據(jù)給上層應(yīng)用。
進(jìn)一步地,在本實施例中,當(dāng)通過獲取到的讀特征將目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)全部接收完成時,還包括:根據(jù)接收到的響應(yīng)數(shù)據(jù)判斷操作是否成功,是則顯示成功信息,否則顯示失敗信息。
實施例四
本發(fā)明實施例四提供一種防止多線程死鎖的裝置,如圖5所示,包括:
第一申請模塊401,用于當(dāng)sdk接口在主線程狀態(tài)時,申請全局互斥量的鎖定權(quán);
第一判斷模塊402,用于判斷第一申請模塊401是否申請成功;
第一申請模塊401,還用于當(dāng)?shù)谝慌袛嗄K402判斷出第一申請模塊401申請不成功時,等待第一預(yù)設(shè)時間間隔后繼續(xù)申請全局互斥量的鎖定權(quán);
第二判斷模塊403,用于當(dāng)?shù)谝慌袛嗄K402判斷出第一申請模塊401申請成功時,判斷目標(biāo)設(shè)備是否已連接;
第一連接模塊404,用于當(dāng)?shù)诙袛嗄K403判斷出目標(biāo)設(shè)備未連接時,連接目標(biāo)設(shè)備;
第一獲取模塊405,用于在第一連接模塊404連接目標(biāo)設(shè)備之后,獲取目標(biāo)設(shè)備的寫特征和讀特征;
第一創(chuàng)建模塊406,用于當(dāng)?shù)诙袛嗄K403判斷出目標(biāo)設(shè)備已連接時,創(chuàng)建輔助線程;還用于在第一獲取模塊405獲取目標(biāo)設(shè)備的寫特征和讀特征之后,創(chuàng)建輔助線程;
第一接收模塊407,用于所述輔助線程通過第一獲取模塊405獲取的讀特征接收目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù);
第一發(fā)送模塊408,用于通過第一獲取模塊405獲取到的寫特征將報文發(fā)送給目標(biāo)設(shè)備;
第三判斷模塊409,用于判斷第一接收模塊407是否將目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)接收完成;還用于當(dāng)自身判斷出第一接收模塊407未將目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)接收完成時,等待第二預(yù)設(shè)時間間隔后,繼續(xù)判斷第一接收模塊407是否將目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)接收完成;
釋放模塊410,用于當(dāng)?shù)谌袛嗄K409判斷出第一接收模塊407將目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)接收完成時,釋放全局互斥量的鎖定權(quán);
第二發(fā)送模塊411,用于當(dāng)釋放模塊410釋放全局互斥量的鎖定權(quán)之后,返回第一接收模塊407接收到的響應(yīng)數(shù)據(jù);
第二申請模塊412,用于當(dāng)sdk接口在子線程狀態(tài)時,申請全局互斥量的鎖定權(quán);
第四判斷模塊413,用于在第二申請模塊412申請全局互斥量的鎖定權(quán)之后,判斷目標(biāo)設(shè)備是否已連接;
第二連接模塊414,用于當(dāng)?shù)谒呐袛嗄K413判斷出目標(biāo)設(shè)備未連接時,連接目標(biāo)設(shè)備;
第二獲取模塊415,用于在第二連接模塊414連接目標(biāo)設(shè)備之后,獲取目標(biāo)設(shè)備的讀特征和寫特征;
第二接收模塊416,用于通過第二獲取模塊415獲取到的讀特征接收目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù);
第一發(fā)送模塊408,還用于通過第二獲取模塊415獲取到的寫特征將報文發(fā)送給目標(biāo)設(shè)備;
第三判斷模塊409,還用于判斷第二接收模塊416是否將目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)接收完成;還用于當(dāng)自身判斷出第二接收模塊416未將目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)接收完成時,等待第二預(yù)設(shè)時間間隔后繼續(xù)判斷第二接收模塊416是否將目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)接收完成;
釋放模塊410,還用于當(dāng)?shù)谌袛嗄K409判斷出第二接收模塊416將目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)接收完成時,釋放全局互斥量的鎖定權(quán)。
本實施例中的裝置,還包括:第五判斷模塊;
第五判斷模塊,用于判斷sdk接口所在的狀態(tài)類型;
第一申請模塊401,具體用于:當(dāng)?shù)谖迮袛嗄K判斷出sdk接口所在的狀態(tài)類型為主線程狀態(tài)時,申請全局互斥量的鎖定權(quán);
第二申請模塊412,具體用于:當(dāng)?shù)谖迮袛嗄K判斷出sdk接口所在的狀態(tài)類型為子線程狀態(tài)時,申請全局互斥量的鎖定權(quán)。
在本實施例中,第五判斷模塊,具體用于:調(diào)用第一預(yù)設(shè)函數(shù)接口,并判斷返回值是否為第一預(yù)設(shè)值,是則判定所述sdk接口所在的狀態(tài)類型為主線程狀態(tài);否則,判定所述sdk接口所在的狀態(tài)類型為子線程狀態(tài)。
本實施例中的裝置,還包括:第六判斷模塊、第二創(chuàng)建模塊、第七判斷模塊和第三創(chuàng)建模塊;
其中,第六判斷模塊,用于在第一申請模塊401申請全局互斥量的鎖定權(quán)之前,判斷是否存在全局互斥量;
第二創(chuàng)建模塊,用于當(dāng)?shù)诹袛嗄K判斷出不存在全局互斥量時,創(chuàng)建全局互斥量;
第一申請模塊401,具體用于:當(dāng)?shù)诹袛嗄K判斷出存在全局互斥量時,申請全局互斥量的鎖定權(quán);還用于在第二創(chuàng)建模塊創(chuàng)建全局互斥量之后,申請全局互斥量的鎖定權(quán);
第七判斷模塊,用于在第二申請模塊412申請全局互斥量的鎖定權(quán)之前,判斷是否存在全局互斥量;
第三創(chuàng)建模塊,用于當(dāng)?shù)谄吲袛嗄K判斷出不存在全局互斥量時,創(chuàng)建全局互斥量;
第二申請模塊412,具體用于:當(dāng)?shù)谄吲袛嗄K判斷出存在全局互斥量時,申請全局互斥量的鎖定權(quán);還用于在第三創(chuàng)建模塊創(chuàng)建全局互斥量之后,申請全局互斥量的鎖定權(quán)。
進(jìn)一步地,在本實施例中,第一申請模塊401,具體用于:調(diào)用第二函數(shù)接口打開全局互斥量,申請全局互斥量的鎖定權(quán);
第一判斷模塊402,具體用于:判斷所述第二函數(shù)接口的返回值的類型,如返回值為第二預(yù)設(shè)值,則判定申請成功;如返回值為第三預(yù)設(shè)值,則判定申請失敗。
第二申請模塊412,具體用于:調(diào)用第八函數(shù)接口打開全局互斥量,申請全局互斥量的鎖定權(quán)。
第一創(chuàng)建模塊406,具體用于:調(diào)用第二預(yù)設(shè)函數(shù)接口創(chuàng)建輔助線程。
第一發(fā)送模塊408,具體用于:調(diào)用第三預(yù)設(shè)函數(shù)接口通過所述寫特征將報文發(fā)送給目標(biāo)設(shè)備。
本實施例中的裝置,還包括:復(fù)位模塊和置位模塊;
其中,復(fù)位模塊,用于在第一接收模塊407接收目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)之前,將接收標(biāo)識復(fù)位;還用于在第二接收模塊416通過第二獲取模塊415獲取到的讀特征接收目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)之前,將接收標(biāo)識復(fù)位;
置位模塊,用于在第一接收模塊407將目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)接收完成時,將接收標(biāo)識置位;還用于在第二接收模塊416通過第二獲取模塊415獲取到的讀特征將目標(biāo)設(shè)備返回的響應(yīng)數(shù)據(jù)接收完成時,將接收標(biāo)識置位;
對應(yīng)地,第三判斷模塊409,具體用于:判斷所述接收標(biāo)識是否置位,是則判定響應(yīng)數(shù)據(jù)全部接收完成,否則判定響應(yīng)數(shù)據(jù)未全部接收完成。
更進(jìn)一步地,在本實施例中,釋放模塊410,具體用于:調(diào)用第九函數(shù)接口釋放全局互斥量的鎖定權(quán)。
本發(fā)明的技術(shù)方案,在多線程同步運行的環(huán)境中,可以使各線程有效運行而不進(jìn)入死鎖,保障了線程安全。
以上所述,僅為本發(fā)明較佳的具體實施方式,但本發(fā)明的保護(hù)范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。因此,本發(fā)明的保護(hù)范圍應(yīng)以權(quán)利要求的保護(hù)范圍為準(zhǔn)。