iOS線(xiàn)程死鎖
前言:
在chat view的開(kāi)發(fā)過(guò)程中,添加了“混合標(biāo)簽添加與顯示”,app出現(xiàn)發(fā)送圖片會(huì)出現(xiàn)卡死的情況,但過(guò)了大約30~40 second后會(huì)恢復(fù)正常。
問(wèn)題分析:
因?yàn)闆](méi)有任何報(bào)錯(cuò)與提示,只能根據(jù)表面現(xiàn)象慢慢分析,經(jīng)過(guò)多次測(cè)試與觀察得出以下規(guī)律:
(1)發(fā)送表情與文本不會(huì)發(fā)生該情況,只有發(fā)送圖片才會(huì)發(fā)生app界面卡死的情況。(主線(xiàn)程阻塞,與大文件上傳有關(guān))
(2)app卡死一定時(shí)間后會(huì)恢復(fù)正常,但時(shí)間不定,大約范圍在30~40 second。(主線(xiàn)程解除阻塞,與系統(tǒng)某些機(jī)制有關(guān))
(3)當(dāng)界面中有g(shù)if圖時(shí)才會(huì)發(fā)生,界面中全是移動(dòng)端本地圖片是能順利發(fā)送。(與gif下載有關(guān))
根據(jù)上述現(xiàn)象,可以總結(jié)為:主線(xiàn)程阻塞,過(guò)后因通信通信失敗而阻塞解除。
因?yàn)榕cgif圖的下載有關(guān),于是分析gif的下載實(shí)現(xiàn),gif圖的下載由以下代碼實(shí)現(xiàn)。
NSData *gifImageData = [NSDatadataWithContentsOfURL:model.imageRemoteURL];
FLAnimatedImage *FLAImage = [FLAnimatedImageanimatedImageWithGIFData:gifImageData];
其中,關(guān)于NSData的靜態(tài)方法dataWithContentsOfURL的說(shuō)明中有以下使用說(shuō)明。
Important
Do not use this synchronous method to request network-based URLs. For network-based URLs, this method can block the current thread for tens of seconds on a slow network, resulting in a poor user experience, and in iOS, may cause your app to be terminated.
這里說(shuō)明了要盡量避免使用dataWithContentsOfURL從網(wǎng)絡(luò)下載資源,因?yàn)樗鼤?huì)阻塞當(dāng)前線(xiàn)程,若下載的文件比較大而網(wǎng)絡(luò)又不好就會(huì)帶來(lái)很差的用戶(hù)體驗(yàn),對(duì)于iOS設(shè)備還可能引起app被迫終止。
雖然只需要把dataWithContentsOfURL放置到別的線(xiàn)程中實(shí)現(xiàn),又或者使用NSURLConnect、NSURLSession中的異步請(qǐng)求方法也能解決問(wèn)題,但本質(zhì)上引起這問(wèn)題是因?yàn)檎{(diào)用dataWithContentsOfURL時(shí)網(wǎng)絡(luò)環(huán)境差嗎?
明顯不是,因?yàn)闇y(cè)試環(huán)境是模擬器,模擬器的cpu、網(wǎng)絡(luò)通信是比真機(jī)要好的,只有GPU是不如真機(jī)。而且問(wèn)題的出現(xiàn)規(guī)律是固定。
但dataWithContentsOfURL已經(jīng)解析了為什么主線(xiàn)程阻塞,那么現(xiàn)在需要解析為什么會(huì)阻塞那么長(zhǎng)的時(shí)間。
CPU分析結(jié)果:
圖中的標(biāo)記的那段是發(fā)生異常情況時(shí)的CPU的情況。從CPU圖上可以更加肯定線(xiàn)程是并沒(méi)有死掉的,而且進(jìn)入了無(wú)法響應(yīng)的狀態(tài),因此可以判斷出發(fā)生線(xiàn)程死鎖的情況。
線(xiàn)程死鎖
死鎖的概念:
死鎖是進(jìn)程死鎖的簡(jiǎn)稱(chēng),是由Dijkstra于1965年研究銀行家算法時(shí)首先提出來(lái)的。它是計(jì)算機(jī)操作系統(tǒng)乃至并發(fā)程序設(shè)計(jì)中最難處理的問(wèn)題之一。實(shí)際上,死鎖問(wèn)題不僅在計(jì)算機(jī)系統(tǒng)中存在,在我們?nèi)粘I钪兴矎V泛存在。
我們先看看這樣一個(gè)生活中的例子:在一條河上有一座橋,橋面較窄,只能容納一輛汽車(chē)通過(guò),無(wú)法讓兩輛汽車(chē)并行。如果有兩輛汽車(chē)A和B分別由橋的兩端駛上該橋,則對(duì)于A車(chē)來(lái)說(shuō),它走過(guò)橋面左面的一段路(即占有了橋的一部分資源),要想過(guò)橋還須等待B車(chē)讓出右邊的橋面,此時(shí)A車(chē)不能前進(jìn);對(duì)于B車(chē)來(lái)說(shuō),它走過(guò)橋面右邊的一段路(即占有了橋的一部分資源),要想過(guò)橋還須等待A車(chē)讓出左邊的橋面,此時(shí)B車(chē)也不能前進(jìn)。兩邊的車(chē)都不倒車(chē),結(jié)果造成互相等待對(duì)方讓出橋面,但是誰(shuí)也不讓路,就會(huì)無(wú)休止地等下去。這種現(xiàn)象就是死鎖。如果把汽車(chē)比做進(jìn)程,橋面作為資源,那麼上述問(wèn)題就描述為:進(jìn)程A占有資源R1,等待進(jìn)程B占有的資源Rr;進(jìn)程B占有資源Rr,等待進(jìn)程A占有的資源R1。而且資源R1和Rr只允許一個(gè)進(jìn)程占用,即:不允許兩個(gè)進(jìn)程同時(shí)占用。結(jié)果,兩個(gè)進(jìn)程都不能繼續(xù)執(zhí)行,若不采取其它措施,這種循環(huán)等待狀況會(huì)無(wú)限期持續(xù)下去,就發(fā)生了進(jìn)程死鎖。
上圖是一張描述一個(gè)簡(jiǎn)單的死鎖模型的圖,首先Thread1鎖定占有資源Y,Thread2鎖定占有資源X,但同時(shí)相互向?qū)Ψ秸?qǐng)求資源,因此都無(wú)法釋放自身資源去訪問(wèn)下一個(gè)資源,結(jié)果兩個(gè)線(xiàn)程相互阻塞。
死鎖的四個(gè)充分必要條件
從以上分析可見(jiàn),如果在計(jì)算機(jī)系統(tǒng)中同時(shí)具備下面四個(gè)必要條件時(shí),那麼會(huì)發(fā)生死鎖。換句話(huà)說(shuō),只要下面四個(gè)條件有一個(gè)不具備,系統(tǒng)就不會(huì)出現(xiàn)死鎖。
〈1〉互斥條件。即某個(gè)資源在一段時(shí)間內(nèi)只能由一個(gè)進(jìn)程占有,不能同時(shí)被兩個(gè)或兩個(gè)以上的進(jìn)程占有。這種獨(dú)占資源如CD-ROM驅(qū)動(dòng)器,打印機(jī)等等,必須在占有該資源的進(jìn)程主動(dòng)釋放它之后,其它進(jìn)程才能占有該資源。這是由資源本身的屬性所決定的。如獨(dú)木橋就是一種獨(dú)占資源,兩方的人不能同時(shí)過(guò)橋。
〈2〉不可搶占條件。進(jìn)程所獲得的資源在未使用完畢之前,資源申請(qǐng)者不能強(qiáng)行地從資源占有者手中奪取資源,而只能由該資源的占有者進(jìn)程自行釋放。如過(guò)獨(dú)木橋的人不能強(qiáng)迫對(duì)方后退,也不能非法地將對(duì)方推下橋,必須是橋上的人自己過(guò)橋后空出橋面(即主動(dòng)釋放占有資源),對(duì)方的人才能過(guò)橋。
〈3〉占有且申請(qǐng)條件。進(jìn)程至少已經(jīng)占有一個(gè)資源,但又申請(qǐng)新的資源;由于該資源已被另外進(jìn)程占有,此時(shí)該進(jìn)程阻塞;但是,它在等待新資源之時(shí),仍繼續(xù)占用已占有的資源。還以過(guò)獨(dú)木橋?yàn)槔?,甲乙兩人在橋上相遇。甲走過(guò)一段橋面(即占有了一些資源),還需要走其余的橋面(申請(qǐng)新的資源),但那部分橋面被乙占有(乙走過(guò)一段橋面)。甲過(guò)不去,前進(jìn)不能,又不后退;乙也處于同樣的狀況。
〈4〉循環(huán)等待條件。存在一個(gè)進(jìn)程等待序列{P1,P2,...,Pn},其中P1等待P2所占有的某一資源,P2等待P3所占有的某一源,......,而Pn等待P1所占有的的某一資源,形成一個(gè)進(jìn)程循環(huán)等待環(huán)。就像前面的過(guò)獨(dú)木橋問(wèn)題,甲等待乙占有的橋面,而乙又等待甲占有的橋面,從而彼此循環(huán)等待。
上面我們提到的這四個(gè)條件在死鎖時(shí)會(huì)同時(shí)發(fā)生。也就是說(shuō),只要有一個(gè)必要條件不滿(mǎn)足,則死鎖就可以排除。
項(xiàng)目中死鎖的形成與解決
根據(jù)以上理論,以及斷點(diǎn)調(diào)試,可以分析得項(xiàng)目的形成,如下圖所描述。
因此只要讓同步下載時(shí)不會(huì)掛起主線(xiàn)程就可以避免線(xiàn)程死鎖的情況發(fā)生。因此項(xiàng)目中使用NSURLConnet的同步請(qǐng)求方法實(shí)現(xiàn)下載即可, 因?yàn)樗粫?huì)掛起主線(xiàn)程,還能讓其他線(xiàn)程往主線(xiàn)程中添加代碼塊block。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站jinyejixie.com,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。
當(dāng)前文章:IOS線(xiàn)程死鎖詳細(xì)介紹-創(chuàng)新互聯(lián)
文章鏈接:http://jinyejixie.com/article6/dioiig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、ChatGPT、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、靜態(tài)網(wǎng)站、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容