1.一種線程中掛時(shí)控的方法,其特征在于,包括以下步驟:
步驟1,創(chuàng)建進(jìn)程的時(shí)控隊(duì)列timerList、掛時(shí)控函數(shù)setTimer_Thread以及時(shí)控響應(yīng)函數(shù)timerFunction;
步驟2,創(chuàng)建子線程及與主線程進(jìn)行交互的消息鏈表,屏蔽掉子線程中時(shí)控信號,需要掛時(shí)控時(shí),直接調(diào)用掛時(shí)控函數(shù)setTimer_Thread掛時(shí)控;
步驟3,主線程響應(yīng)時(shí)到信號,并執(zhí)行時(shí)控響應(yīng)函數(shù)timerFunction,將線程時(shí)控屬性轉(zhuǎn)換為時(shí)控消息加入到對應(yīng)線程的消息鏈表中;
步驟4,子線程取出時(shí)控消息,得到時(shí)控屬性,根據(jù)時(shí)控屬性進(jìn)行相應(yīng)的時(shí)控處理。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,步驟1中,所述時(shí)控隊(duì)列timerList用于存儲整個(gè)進(jìn)程所有線程的時(shí)控;時(shí)控隊(duì)列timerList中的每個(gè)時(shí)控項(xiàng)包含兩個(gè)時(shí)控屬性,分別為時(shí)控屬性一和時(shí)控屬性二,時(shí)控屬性一用于指示線程ID,時(shí)控屬性二用于指示時(shí)間屬性ID;時(shí)控隊(duì)列timerList中,各時(shí)控項(xiàng)按時(shí)控時(shí)到先后順序依次排列;
掛時(shí)控函數(shù)setTimer_Thread包含四個(gè)參數(shù):時(shí)控屬性一、時(shí)控屬性二、時(shí)控標(biāo)識和時(shí)間值,其中,時(shí)控標(biāo)識用于指示是掛時(shí)控還是刪除時(shí)控,時(shí)間值是指時(shí)控的相對于掛時(shí)控時(shí)的時(shí)間值;
時(shí)控響應(yīng)函數(shù)timerFunction為進(jìn)程的時(shí)控響應(yīng)函數(shù),所有時(shí)到響應(yīng)都首先執(zhí)行此函數(shù)。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,步驟1中所述掛時(shí)控函數(shù)setTimer_Thread執(zhí)行如下步驟:
步驟1-1,根據(jù)時(shí)控屬性一與時(shí)控屬性二生成Hash關(guān)鍵字;
步驟1-2,判定時(shí)控標(biāo)識,如果為掛時(shí)控,則轉(zhuǎn)到步驟1-3,如果是取消時(shí)控則轉(zhuǎn)到步驟1-6;
步驟1-3,根據(jù)Hash關(guān)鍵字找到時(shí)控項(xiàng)的存儲位置,存儲時(shí)控項(xiàng);
步驟1-4,根據(jù)時(shí)控的時(shí)到順序,在時(shí)控隊(duì)列timerList中找到對應(yīng)的位置,插入該時(shí)控;
步驟1-5,如果該時(shí)控處于時(shí)控隊(duì)列timerList隊(duì)首,則調(diào)用系統(tǒng)函數(shù)setitimer重掛進(jìn)程的時(shí)控;
步驟1-6,根據(jù)Hash關(guān)鍵字,找到該時(shí)控的存儲位置及在時(shí)控隊(duì)列中的位置;
步驟1-7,從時(shí)控隊(duì)列timerList中刪除該時(shí)控;
步驟1-8,如果該時(shí)控處于時(shí)控隊(duì)列timerList隊(duì)首,則調(diào)用系統(tǒng)函數(shù)setitimer根據(jù)時(shí)控隊(duì)列timerList新隊(duì)首的時(shí)控項(xiàng)重掛進(jìn)程的時(shí)控。
4.根據(jù)權(quán)利要求3所述的方法,其特征在于,步驟2中,所述子線程與主線程進(jìn)行交互的消息鏈表項(xiàng)包含三部分:消息長度、消息屬性標(biāo)識和消息內(nèi)容,消息長度指消息的字節(jié)數(shù);消息屬性標(biāo)識用于指示該消息是普通消息還是時(shí)控消息;消息內(nèi)容即消息的詳細(xì)內(nèi)容,如果消息屬性標(biāo)識為1,則其前兩個(gè)字節(jié)存儲的是時(shí)控屬性二。
5.根據(jù)權(quán)利要求4所述的方法,其特征在于,步驟2中,每個(gè)子線程對應(yīng)一個(gè)消息鏈表,主線程或子線程訪問該消息鏈表時(shí),利用線程鎖進(jìn)行加鎖,訪問結(jié)束解鎖。
6.根據(jù)權(quán)利要求5所述的方法,其特征在于,步驟3中,所述主線程響應(yīng)時(shí)到信號,并執(zhí)行時(shí)控響應(yīng)函數(shù)timerFunction,包括如下步驟:
步驟3-1,從時(shí)控隊(duì)列timerList隊(duì)首取出一個(gè)時(shí)控項(xiàng),并調(diào)整其下一個(gè)時(shí)控的前向指針;
步驟3-2,判定時(shí)控項(xiàng)的時(shí)控屬性一,如果為0,轉(zhuǎn)向步驟3-3;如果為1,則轉(zhuǎn)向步驟3-4;
步驟3-3,主線程根據(jù)時(shí)控屬性二進(jìn)行相應(yīng)的時(shí)控處理,然后轉(zhuǎn)向步驟3-8;
步驟3-4,根據(jù)時(shí)控屬性一找到對應(yīng)線程ID的子線程,把時(shí)控屬性二封裝成時(shí)控消息;
步驟3-5,對該對應(yīng)線程的消息鏈表加鎖;
步驟3-6,若該消息鏈表為空,直接插入時(shí)控消息;若不為空,則從頭開始查找到第一個(gè)消息屬性標(biāo)識msgFlag為0的項(xiàng),即第一個(gè)普通消息,在其前面插入時(shí)控消息;
步驟3-7,對該消息鏈表解鎖,并通知該子線程;
步驟3-8,根據(jù)時(shí)控隊(duì)列timerList隊(duì)首的時(shí)控項(xiàng),調(diào)用系統(tǒng)函數(shù)setitimer重新掛進(jìn)程的時(shí)控。
7.根據(jù)權(quán)利要求6所述的方法,其特征在于,步驟4包括如下步驟:
步驟4-1,屏蔽SIGALRM信號,確保線程不會響應(yīng)進(jìn)程的信號;
步驟4-2,對消息鏈表加鎖;
步驟4-3,依次取出消息鏈表中的消息,存入線程的局部鏈表中;
步驟4-4,對消息鏈表解鎖;
步驟4-5,從線程的局部鏈表中逐一取出消息處理;
步驟4-6,判定消息屬性標(biāo)識msgFlag,如果為普通消息,轉(zhuǎn)到步驟4-7,如果為時(shí)控消息,則轉(zhuǎn)到步驟4-8;
步驟4-7,對該普通消息進(jìn)行處理,返回到步驟4-2;
步驟4-8,從該時(shí)控消息中提取時(shí)控屬性二,進(jìn)行對應(yīng)的時(shí)控處理;
步驟4-9,返回到步驟4-2。