色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

如何解決Linux下信號(hào)產(chǎn)生的死鎖?

一次測(cè)試環(huán)境發(fā)生了server死鎖,整個(gè)server的任務(wù)線程都被hang住。而死鎖的代碼就在我負(fù)責(zé)的程序日志部分中l(wèi)ocaltime_r函數(shù)調(diào)用處。

程序日記需要記錄打印日志的時(shí)間,而localtime_r函數(shù)就是用于將系統(tǒng)時(shí)間轉(zhuǎn)換為本地時(shí)間。同樣功能的函數(shù)還有l(wèi)ocaltime。兩個(gè)函數(shù)的區(qū)別是:localtime_r是thread-safe,其返回的結(jié)果存在由用戶提供的buffer中;而localtime返回的結(jié)果是指向static變量,多線程環(huán)境可被其他線程修改。localtime_r實(shí)現(xiàn)中有一把鎖,負(fù)責(zé)locktzfile中的狀態(tài)變量,而server就在這里發(fā)生死鎖。

經(jīng)過(guò)分析死鎖是由于發(fā)kill信號(hào),信號(hào)處理函數(shù)引起的。原線程打印程序日志獲得localtime_r中需要的鎖后,kill信號(hào)觸發(fā)中斷處理,正好分配給該線程處理中斷。信號(hào)處理函數(shù)中再次打印日志,調(diào)用localtime_r的鎖時(shí)發(fā)生死鎖。

之前的信號(hào)處理方式為異步方式,同時(shí)信號(hào)處理函數(shù)中做了很多事情。之前大家一直關(guān)注線程安全,卻從來(lái)沒(méi)有注意過(guò)異步信號(hào)處理函數(shù)的安全性。這次最新版本由于還在開(kāi)發(fā)中,大家調(diào)用了大量日志打印,增加了死鎖的概率才將這個(gè)問(wèn)題暴露出來(lái)。

##SignalHandlingandNonreentrantFunctions

信號(hào)處理函數(shù)不推薦做太多工作,如果調(diào)用函數(shù)需要是reentrant。reentrant可重新進(jìn)入的,可以理解為一次調(diào)用發(fā)生后,不會(huì)對(duì)該函數(shù)的再次調(diào)用發(fā)生任何影響。即reentrant函數(shù)中不可以有static或global變量,不可以分配釋放內(nèi)存,通常不可以使用修改用戶提供的對(duì)象,修改errno等等。具體可以看http://www.gnu.org/software/libc/manual/html_node/Nonreentrancy.html#Nonreentrancy

##解決信號(hào)處理帶來(lái)的死鎖異步變同步

自己的第一直覺(jué)是既然信號(hào)處理函數(shù)不可以做太多工作,需要調(diào)用non-reentrant函數(shù),那就把日志打印全部去掉好了。但發(fā)現(xiàn),團(tuán)隊(duì)項(xiàng)目的信號(hào)處理函數(shù)中做了大量工作,許多調(diào)試方法和調(diào)試信息通過(guò)kill信號(hào)獲得,而且這些調(diào)用基本都是non-reentrant。所以只能修改信號(hào)處理的方案。

信號(hào)處理的方式除了異步使用方式還有同步使用方式。同步信號(hào)處理