專利名稱:一種多線程通訊程序中防止線程吊死的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及多線程控制技術(shù)領(lǐng)域,具體涉及一種多線程通訊程序中防止線 程吊死的方法。
背景技術(shù):
隨著智能網(wǎng)的發(fā)展,智能網(wǎng)的通訊程序需要鏈接的節(jié)點(diǎn)日益增多,通訊數(shù) 據(jù)量也逐漸加大,對通訊程序的效率要求也相應(yīng)地提高。目前使用的智能網(wǎng)通 訊程序,大都采用多線程架構(gòu),即程序中存在一個(gè)主控線程,用于處理建鏈(建
立TCP連接)請求或發(fā)起建鏈請求。主控線程針對每一個(gè)TCP連接上的節(jié)點(diǎn), 創(chuàng)建一對子線程,即接收子線程和發(fā)生子線程,分別用于在該TCP連接上接 收和發(fā)送消息。主控線程還將節(jié)點(diǎn)模塊號、局號、IP地址、發(fā)送子線程和接 收子線程的線程ID (標(biāo)識)號等信息記錄到全局的鏈路信息表中。
當(dāng)新建鏈路或出現(xiàn)斷鏈情況時(shí),通信程序需要新建發(fā)送、接收子線程或關(guān) 閉發(fā)送、接收子線程,并相應(yīng)地更新鏈路信息表中的對應(yīng)信息。由于通訊主控 線程、接收子線程或發(fā)送子線程中的任何一個(gè)都可能會(huì)更新鏈路信息表, 一般 通過互斥鎖來保證同時(shí)只有一個(gè)線程操作鏈^各信息表。由于通訊主控線程、接 收子線程、發(fā)送子線程是同時(shí)運(yùn)行的,當(dāng)接收子線程或發(fā)送子線程發(fā)現(xiàn)鏈路異 常,會(huì)在獲取到互斥鎖后,更新鏈路信息表,同時(shí)主控線程由于沒有收到心跳 消息的原因,也檢測到鏈路異常,此時(shí)主控線程會(huì)關(guān)閉鏈路,并回收對應(yīng)鏈路 的線程資源, 一般為殺死線程。如果接收或發(fā)送子線程在獲取到互斥鎖的情況 下被主控線程殺死,會(huì)導(dǎo)致互斥鎖不可用,主控線程下次獲取互斥鎖時(shí),會(huì)陷 入無限等待狀態(tài),從而導(dǎo)致線程吊死。
可以看出,現(xiàn)有技術(shù)在智能網(wǎng)中使用多線程模式進(jìn)行機(jī)器間通訊時(shí),主控 線程在關(guān)閉鏈路對應(yīng)的線程時(shí),可能導(dǎo)致通訊線程吊死情況的發(fā)生。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問題是提供一種多線程通訊程序中防止線程吊死 的方法,防止通信程序中發(fā)生線程吊死,保證通訊程序的正常運(yùn)行。
為解決上述技術(shù)問題,本發(fā)明提供方案如下
一種多線程通訊程序中防止線程吊死的方法,所述通訊程序包括
用于發(fā)起建鏈請求和/或處理建鏈請求的主控線程;
至少一對子線程,其中,每一對子線程對應(yīng)于一條TCP連接,包括在該 TCP連接上接收消息的接收子線程和發(fā)送消息的發(fā)送子線程; 以及用于保存每條TCP連接的鏈路信息的鏈路信息表; 所述方法包^^舌
第 一子線程;險(xiǎn)測到本子線程對應(yīng)的第一 TCP連接發(fā)生異常時(shí),在第一 TCP 連接的鏈路信息中設(shè)置退出標(biāo)志位并退出本子線程;
主控線程周期性地輪詢所述鏈路信息表,并在檢測到第一 TCP連接的鏈 路信息中的退出標(biāo)志位時(shí),關(guān)閉第一TCP連接,殺死第一TCP連接對應(yīng)的所 有剩余子線程,并清空第一 TCP連接的鏈路信息。
優(yōu)選地,上述方法中,第一子線程進(jìn)一步根據(jù)所述第一 TCP連接上是否 發(fā)生發(fā)送錯(cuò)誤或接收錯(cuò)誤,檢測所述第一 TCP連接是否發(fā)生異常。
優(yōu)選地,上述方法中,所述第一子線程在退出本子線程失敗時(shí),進(jìn)一步進(jìn) 入休眠狀態(tài)并在第一 TCP連接的鏈路信息中設(shè)置標(biāo)識第一子線程處于休眠狀 態(tài)的狀態(tài)#"息;
所述主控線程在^r測到所述狀態(tài)信息后,殺死處于休眠狀態(tài)的第一子線程。
優(yōu)選地,上述方法中,所述主控線程進(jìn)一步通過關(guān)閉第一 TCP連接的套 接字描述符,關(guān)閉所述第一TCP連接。
優(yōu)選地,上述方法中,所述主控線程進(jìn)一步根據(jù)第一 TCP連接的鏈路信 息中保存的子線程ID號,殺死第一 TCP連接對應(yīng)的所有剩余子線程。
本發(fā)明還提供了另一種多線程通訊程序中防止線程吊死的方法,所述通訊 程序包括
用于發(fā)起建鏈請求和/或處理建鏈請求的主控線程;
至少一對子線程,其中,每一對子線程對應(yīng)于一條TCP連接,包括在該 TCP連接上接收消息的接收子線程和發(fā)送消息的發(fā)送子線程; 以及用于保存每條TCP連接的鏈路信息的鏈路信息表; 所述方法包4舌
主控線程檢測到第一 TCP連接發(fā)生異常時(shí),關(guān)閉第一 TCP連接;
第一 TCP連"^妻對應(yīng)的子線程;險(xiǎn)測到所述第一 TCP連接發(fā)生異常,則在第 一 TCP連接的鏈^各信息中設(shè)置退出標(biāo)志位并退出本子線程;
主控線程周期性地輪詢所述鏈路信息表,當(dāng)檢測到第一 TCP連接的鏈路 信息中的退出標(biāo)志位時(shí),殺死第一 TCP連接對應(yīng)的所有剩余子線程,并清空 第一 TCP連接的鏈路信息。
優(yōu)選地,上述方法中,第一 TCP連接對應(yīng)的子線程進(jìn)一步根據(jù)所述第一 TCP連接上是否發(fā)生發(fā)送錯(cuò)誤或接收錯(cuò)誤,檢測所述第一 TCP連接是否發(fā)生 異常。
優(yōu)選地,上述方法中,第一 TCP連接對應(yīng)的子線程在退出本子線程失敗 時(shí),進(jìn)一步進(jìn)入休眠狀態(tài)并在第一 TCP連接的鏈路信息中設(shè)置標(biāo)識本子線程 處于休眠狀態(tài)的狀態(tài)信息;
所述主控線程在檢測到所述狀態(tài)信息后,殺死處于休眠狀態(tài)的子線程。
優(yōu)選地,上述方法中,所述主控線程進(jìn)一步通過關(guān)閉第一 TCP連接的套 接字描述符,關(guān)閉所述第一TCP連接。
優(yōu)選地,上述方法中,所述主控線程進(jìn)一步根據(jù)第一 TCP連接的鏈路信 息中保存的子線程ID號,殺死第一 TCP連接對應(yīng)的所有剩余子線程。
從以上所述可以看出,本發(fā)明提供的多線程通訊程序中防止線程吊死的方 法,通訊子線程在檢測到連接異常時(shí),通過設(shè)置退出標(biāo)志位來指示異常,接收 子線程和發(fā)送子線程可以分別設(shè)置退出標(biāo)志位,主控線程根據(jù)退出標(biāo)志位殺死 對應(yīng)的子線程,從而保證了主控線程、接收/發(fā)送子線程不會(huì)對鏈路信息表中 的同一內(nèi)容同時(shí)進(jìn)行操作,即,本實(shí)施例通過特定的標(biāo)志位和流程,避免了使
通訊程序的正常運(yùn)行。并且,在本發(fā)明中,主控線程檢測到TCP連接發(fā)生異 常后,并沒有直接殺死該TCP連接對應(yīng)的接收/發(fā)送子線程,而是首先關(guān)閉該
TCP連接,并等待該TCP連接的接收/發(fā)送子線程主動(dòng)退出,在接收/發(fā)送子線 程退出失敗后,再殺死接收/發(fā)送子線程,從而避免了直接殺死這些子線程, 可能導(dǎo)致的數(shù)據(jù)接收或發(fā)送失敗對通信程序帶來無法確定的影響。最后,本發(fā) 明可以采用標(biāo)準(zhǔn)C語言實(shí)現(xiàn),具有很好的可移植性。
圖1為本發(fā)明實(shí)施例適用的智能網(wǎng)多SCP系統(tǒng)的結(jié)構(gòu)圖2為本發(fā)明實(shí)施例的系統(tǒng)架構(gòu)圖3為本發(fā)明實(shí)施例所述防止線程吊死的方法流程圖4為本發(fā)明另一實(shí)施例所述防止線程吊死的方法流程圖。
具體實(shí)施例方式
本發(fā)明所述方法,在鏈路發(fā)生異常時(shí),通過特定的處理順序和處理方式, 使得主控線程、接收/發(fā)送子線程不會(huì)對鏈路信息表中的同 一信息同時(shí)進(jìn)行更 新,從而各個(gè)線程在不需要獲取互斥鎖的情況下即可對鏈路信息表進(jìn)行更新, 避免通信程序中發(fā)生線程吊死,保障了業(yè)務(wù)的正常運(yùn)行。以下結(jié)合附圖,通過 具體實(shí)施例對本發(fā)明作詳細(xì)說明。
以下實(shí)施例以智能網(wǎng)多SCP系統(tǒng)為例進(jìn)4亍說明。如圖1所示,這種系統(tǒng) 有多個(gè)業(yè)務(wù)控制點(diǎn)(SCP, Service Control Point),每個(gè)SCP上都有業(yè)務(wù)運(yùn)行, 并有自己的業(yè)務(wù)。多個(gè)SCP由一個(gè)業(yè)務(wù)管理點(diǎn)(SMP, Service Management Point)管理。在SCP之間、SCP和SMP之間都建立TCP長鏈接。
圖2為本發(fā)明實(shí)施例的系統(tǒng)架構(gòu)圖。如圖2所示,SCP、 SMP上的通訊程 序在啟動(dòng)時(shí)都會(huì)創(chuàng)建一個(gè)用于發(fā)起建鏈請求和/或處理建鏈請求的主控線程, 然后與其它SCP、 SMP建立TCP長連接,并對于每條建立上的連接,創(chuàng)建與 之對應(yīng)的一對子線程(即發(fā)送子線程和接收子線程),分別進(jìn)行發(fā)送、接收消 息工作。并且,創(chuàng)建一個(gè)全局的鏈路信息表,將每條TCP連接的鏈路信息記 錄在該鏈路信息表。
在TCP連接發(fā)生異常時(shí),通訊子線程(包括接收/發(fā)送子線程)和主控線 程都可能檢測到該TCP連接發(fā)生異常,下面分別對兩種情況下進(jìn)行說明。
1.通訊子線程檢測到TCP連接異常
如圖3所示,本實(shí)施例所述多線程通訊程序中防止線程吊死的方法,包括 以下步驟
步驟31,通訊程序啟動(dòng)主控線程,并與其它SCP、 SMP建立TCP長連接, 并對于每條建立上的連接,創(chuàng)建與之對應(yīng)的一對子線程,以及在鏈路信息表中 記錄各個(gè)TCP連接的鏈路信息。
步驟32,當(dāng)通訊子線程在其對應(yīng)的某條TCP連接(為描述方便,以下稱 為第一TCP連接)上的接收消息或發(fā)送消息發(fā)生錯(cuò)誤,此時(shí)判斷該第一TCP 連接發(fā)生異常,通訊子線程在第一 TCP連接的鏈路信息中設(shè)置退出標(biāo)志位 (EXITFLAG),用于指示第一 TCP連接對應(yīng)的接收/發(fā)送子線程是否因?yàn)榘l(fā)生 異常而需要退出;并且,該通訊子線程嘗試主動(dòng)退出,如果退出失敗,則該通 訊子線程進(jìn)入休眠狀態(tài)。這里的通訊子線程可以是第一 TCP連接所對應(yīng)的接 收子線程或發(fā)送子線程。
步驟33,主控線程在啟動(dòng)后,便開始周期性地輪詢鏈路信息表,判斷鏈 路信息表中各個(gè)TCP連接的鏈路信息中是否存在EXITFLAG標(biāo)志位已置位的 情形。由于鏈路信息表中的第一 TCP連接的鏈路信息中已將EXITFLAG標(biāo)志 位置位,因此,當(dāng)主控線程輪詢到該第一TCP連接時(shí),檢測到EXITFLAG標(biāo) 志位已置位,此時(shí),主控線程關(guān)閉套接字該第一 TCP連接的(Socket )描述符, 從而關(guān)閉第一 TCP連接,并根據(jù)第一 TCP連接的鏈路信息中所保存的第一 TCP連接對應(yīng)的通訊子線程的線程標(biāo)識(ID)號,殺死(kill)第一TCP連接 對應(yīng)的通訊子線程,并更新鏈路信息表,將第一 TCP連接對應(yīng)的鏈路信息清 空。這里,由于第一TCP連接對應(yīng)的某個(gè)通信子線程可能已經(jīng)主動(dòng)成功退出, 此時(shí),主控線程只需要?dú)⑺赖谝?TCP連接對應(yīng)的所有剩余子線程。此后,主 控線程繼續(xù)輪詢下一個(gè)TCP連接,執(zhí)行類似的判斷操作。
上述步驟32中,通訊子線程在退出失敗進(jìn)入睡眠狀態(tài)時(shí),還可以進(jìn)一步 在鏈路信息中設(shè)置標(biāo)識該子線程處于休眠狀態(tài)的狀態(tài)信息,從而在步驟33中, 主控線程在檢測到該狀態(tài)信息后,可以據(jù)此殺死處于休眠狀態(tài)的該通訊子線 程。
從以上所述可以看出,本實(shí)施例中,通訊子線程在4會(huì)測到連接異常時(shí),通過設(shè)置退出標(biāo)志位來指示異常,接收子線程和發(fā)送子線程可以分別設(shè)置退出標(biāo) 志位,主控線程根據(jù)退出標(biāo)志位殺死對應(yīng)的子線程,從而保證了主控線程、接 收/發(fā)送子線程不會(huì)對鏈路信息表中的同一內(nèi)容同時(shí)進(jìn)行操作,即,本實(shí)施例 通過特定的標(biāo)志位和流程,避免了使用互斥鎖,從而從根本上避免了因?yàn)榛コ?鎖不可用而導(dǎo)致的線程吊死,保證了通訊程序的正常運(yùn)行。
2.主控線程4企測到TCP連接異常
如圖4所示,本實(shí)施例所述多線程通訊程序中防止線程吊死的方法,包括 以下步驟
步驟41,通訊程序啟動(dòng)主控線程,并與其它SCP、 SMP建立TCP長連接, 并對于每條建立上的連^妄,創(chuàng)建與之對應(yīng)的一對子線程,以及在鏈路信息表中 記錄各個(gè)TCP連接的鏈路信息。
步驟42,主控線程在啟動(dòng)后,定時(shí)檢測每條TCP連接的心跳消息是否正 常,即是否收到該TCP連接對端的心跳消息如果在M^定時(shí)間(如20秒)內(nèi) 沒有收到對端的心跳消息,則認(rèn)為該TCP連接異常,此時(shí),主控線程通過關(guān) 閉該TCP連接的套接字(socket)描述符來關(guān)閉該TCP連接(這里,假設(shè)該 TCP連接為第一 TCP連接);
步驟43,由于第一TCP連接被關(guān)閉,從而導(dǎo)致該第一TCP連接的通訊子 線程發(fā)生接收或發(fā)送錯(cuò)誤,在檢測到上述錯(cuò)誤之后,通訊子線程設(shè)置在第一 TCP連接對應(yīng)的鏈路信息中設(shè)置EXITFLAG標(biāo)志位,并嘗試主動(dòng)退出如果 退出失敗,則進(jìn)入^f木眠狀態(tài)。
步驟44,主控線程在啟動(dòng)后,便開始周期性地輪詢鏈路信息表,判斷鏈 路信息表中各個(gè)TCP連接的鏈路信息中是否存在EXITFLAG標(biāo)志位已置位的 情形。由于鏈路信息表中的第一 TCP連接的鏈路信息中已將EXITFLAG標(biāo)志 位置位,因此,當(dāng)主控線程輪詢到該第一TCP連接時(shí),檢測到EXITFLAG標(biāo) 志位已置位,此時(shí),主控線程根據(jù)第一 TCP連接的鏈路信息中所保存的第一 TCP連接對應(yīng)的通訊子線程的線程標(biāo)識(ID )號,殺死(kill)第一 TCP連接 對應(yīng)的通訊子線程,并在線程資源(如堆棧等)回收完畢后,更新鏈路信息表, 將第一TCP連接對應(yīng)的鏈路信息清空。這里,由于第一TCP連接對應(yīng)的某個(gè) 通信子線程可能已經(jīng)主動(dòng)成功退出,此時(shí),主控線程只需要?dú)⑺赖谝?TCP連接對應(yīng)的所有剩余子線程。此后,主控線程繼續(xù)輪詢下一個(gè)TCP連接,執(zhí)行 類似的判斷操作。
在本實(shí)施例中,主控線程檢測到第一 TCP連接發(fā)生異常后,并沒有直接 殺死第一TCP連接對應(yīng)的通信子線程,而是首先關(guān)閉第一TCP連接,并等待 第一 TCP連^l妄的通信子線程主動(dòng)退出,在通信子線程退出失敗后,再殺死通 信子線程。這種做法的原因在于在第一TCP連接發(fā)生異常時(shí),其接收/發(fā)送 子線程可能仍然在接收或發(fā)送數(shù)據(jù),如果直接殺死這些子線程,可能導(dǎo)致數(shù)據(jù) 接收或發(fā)送失敗,對通信程序帶來無法確定的影響,因此,本實(shí)施例讓子線程 主動(dòng)退出,以避免上述情況的發(fā)生。
綜上所述,本發(fā)明實(shí)施例中通過設(shè)置退出標(biāo)志位以及特定的流程,有效的 防止了通訊程序中的線程吊死,避免SCP 、 SMP之間長時(shí)間通訊中斷。
本發(fā)明實(shí)施例中以SCP、 SMP之間通訊程序作為具體實(shí)施,但本發(fā)明并 不局限于此。本發(fā)明所屬領(lǐng)域的技術(shù)人員應(yīng)能理解,在不偏離本發(fā)明的宗旨和 精神的情況下,可以對它進(jìn)行形式和細(xì)節(jié)的顯而易見的修改。因此,以上描述 的實(shí)施例是說明性而不是限制性的,在不脫離本發(fā)明的精神和范圍的情況下, 所有的變換和^f奮改都在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種多線程通訊程序中防止線程吊死的方法,所述通訊程序包括用于發(fā)起建鏈請求和/或處理建鏈請求的主控線程;至少一對子線程,其中,每一對子線程對應(yīng)于一條TCP連接,包括在該TCP連接上接收消息的接收子線程和發(fā)送消息的發(fā)送子線程;以及用于保存每條TCP連接的鏈路信息的鏈路信息表;其特征在于,所述方法包括第一子線程檢測到本子線程對應(yīng)的第一TCP連接發(fā)生異常時(shí),在第一TCP連接的鏈路信息中設(shè)置退出標(biāo)志位并退出本子線程;主控線程周期性地輪詢所述鏈路信息表,并在檢測到第一TCP連接的鏈路信息中的退出標(biāo)志位時(shí),關(guān)閉第一TCP連接,殺死第一TCP連接對應(yīng)的所有剩余子線程,并清空第一TCP連接的鏈路信息。
2. 如權(quán)利要求1所述的方法,其特征在于,第一子線程進(jìn)一步根據(jù)所述 第一 TCP連接上是否發(fā)生發(fā)送錯(cuò)誤或接收錯(cuò)誤,檢測所述第一 TCP連接是否 發(fā)生異常。
3. 如權(quán)利要求l所述的方法,其特征在于,所述第一子線程在退出本子線程失敗時(shí),進(jìn)一步進(jìn)入休眠狀態(tài)并在第一 TCP連接的鏈路信息中設(shè)置標(biāo)識第一子線程處于休眠狀態(tài)的狀態(tài)信息;所述主控線程在檢測到所述狀態(tài)信息后,殺死處于休眠狀態(tài)的第一子線程。
4. 如權(quán)利要求1所述的方法,其特征在于,所述主控線程進(jìn)一步通過關(guān) 閉第一 TCP連接的套接字描述符,關(guān)閉所述第一 TCP連接。
5. 如權(quán)利要求1所述的方法,其特征在于,所述主控線程進(jìn)一步根據(jù)第 一 TCP連接的鏈路信息中保存的子線程ID號,殺死第一 TCP連接對應(yīng)的所 有剩余子線程。
6. —種多線程通訊程序中防止線程吊死的方法,所述通訊程序包括 用于發(fā)起建鏈請求和/或處理建鏈請求的主控線程;至少一對子線程,其中,每一對子線程對應(yīng)于一條TCP連接,包括在該 TCP連接上接收消息的接收子線程和發(fā)送消息的發(fā)送子線程; 以及用于保存每條TCP連接的鏈路信息的鏈路信息表; 其特征在于,所述方法包括主控線程;險(xiǎn)測到第一 TCP連接發(fā)生異常時(shí),關(guān)閉第一 TCP連接;第一 TCP連接對應(yīng)的子線程檢測到所述第一 TCP連接發(fā)生異常,則在第一 TCP連接的鏈路信息中設(shè)置退出標(biāo)志位并退出本子線程;主控線程周期性地輪詢所述鏈路信息表,當(dāng)檢測到第一 TCP連接的鏈路信息中的退出標(biāo)志位時(shí),殺死第一 TCP連接對應(yīng)的所有剩余子線程,并清空第一 TCP連接的鏈路信息。
7. 如權(quán)利要求6所述的方法,其特征在于,第一TCP連接對應(yīng)的子線程 進(jìn)一步根據(jù)所述第一 TCP連接上是否發(fā)生發(fā)送錯(cuò)誤或接收錯(cuò)誤,檢測所述第 一TCP連接是否發(fā)生異常。
8. 如權(quán)利要求6所述的方法,其特征在于,第一 TCP連接對應(yīng)的子線程在退出本子線程失敗時(shí),進(jìn)一步進(jìn)入休眠狀態(tài)并在第一 TCP連接的鏈路信息中設(shè)置標(biāo)識本子線程處于休眠狀態(tài)的狀態(tài)信臺 ,&,所述主控線程在4全測到所述狀態(tài)信息后,殺死處于休眠狀態(tài)的子線程。
9. 如權(quán)利要求6所述的方法,其特征在于,所述主控線程進(jìn)一步通過關(guān) 閉第一 TCP連接的套接字描述符,關(guān)閉所述第一 TCP連接。
10. 如權(quán)利要求6所述的方法,其特征在于,所述主控線程進(jìn)一步根據(jù)第 一 TCP連接的鏈路信息中保存的子線程ID號,殺死第一 TCP連接對應(yīng)的所 有剩余子線程。
全文摘要
本發(fā)明提供了一種多線程通訊程序中防止線程吊死的方法。所述方法包括第一子線程檢測到本子線程對應(yīng)的第一TCP連接發(fā)生異常時(shí),在第一TCP連接的鏈路信息中設(shè)置退出標(biāo)志位并退出本子線程;主控線程周期性地輪詢所述鏈路信息表,并在檢測到第一TCP連接的鏈路信息中的退出標(biāo)志位時(shí),關(guān)閉第一TCP連接,殺死第一TCP連接對應(yīng)的所有剩余子線程,并清空第一TCP連接的鏈路信息。按照本發(fā)明,可以防止通信程序中發(fā)生線程吊死,保證通訊程序的正常運(yùn)行。
文檔編號G06F9/38GK101355577SQ20081011926
公開日2009年1月28日 申請日期2008年9月1日 優(yōu)先權(quán)日2008年9月1日
發(fā)明者冰 李 申請人:中興通訊股份有限公司