欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

IOS 線程死鎖詳細(xì)介紹

 更新時間:2017年02月28日 14:59:01   作者:luozhiwei_iOS  
這篇文章主要介紹了IOS 線程死鎖詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下

iOS線程死鎖

前言:

     在chat view的開發(fā)過程中,添加了“混合標(biāo)簽添加與顯示”,app出現(xiàn)發(fā)送圖片會出現(xiàn)卡死的情況,但過了大約30~40 second后會恢復(fù)正常。

問題分析:

     因為沒有任何報錯與提示,只能根據(jù)表面現(xiàn)象慢慢分析,經(jīng)過多次測試與觀察得出以下規(guī)律:

     (1)發(fā)送表情與文本不會發(fā)生該情況,只有發(fā)送圖片才會發(fā)生app界面卡死的情況。(主線程阻塞,與大文件上傳有關(guān))
     (2)app卡死一定時間后會恢復(fù)正常,但時間不定,大約范圍在30~40 second。(主線程解除阻塞,與系統(tǒng)某些機制有關(guān))
     (3)當(dāng)界面中有g(shù)if圖時才會發(fā)生,界面中全是移動端本地圖片是能順利發(fā)送。(與gif下載有關(guān))

     根據(jù)上述現(xiàn)象,可以總結(jié)為:主線程阻塞,過后因通信通信失敗而阻塞解除。

     因為與gif圖的下載有關(guān),于是分析gif的下載實現(xiàn),gif圖的下載由以下代碼實現(xiàn)。

        NSData *gifImageData = [NSDatadataWithContentsOfURL:model.imageRemoteURL];
        FLAnimatedImage *FLAImage = [FLAnimatedImageanimatedImageWithGIFData:gifImageData];

     其中,關(guān)于NSData的靜態(tài)方法dataWithContentsOfURL的說明中有以下使用說明。

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.

     這里說明了要盡量避免使用dataWithContentsOfURL從網(wǎng)絡(luò)下載資源,因為它會阻塞當(dāng)前線程,若下載的文件比較大而網(wǎng)絡(luò)又不好就會帶來很差的用戶體驗,對于iOS設(shè)備還可能引起app被迫終止。

  雖然只需要把dataWithContentsOfURL放置到別的線程中實現(xiàn),又或者使用NSURLConnect、NSURLSession中的異步請求方法也能解決問題,但本質(zhì)上引起這問題是因為調(diào)用dataWithContentsOfURL時網(wǎng)絡(luò)環(huán)境差嗎?

  明顯不是,因為測試環(huán)境是模擬器,模擬器的cpu、網(wǎng)絡(luò)通信是比真機要好的,只有GPU是不如真機。而且問題的出現(xiàn)規(guī)律是固定。

  但dataWithContentsOfURL已經(jīng)解析了為什么主線程阻塞,那么現(xiàn)在需要解析為什么會阻塞那么長的時間。

     CPU分析結(jié)果:
     
     

       圖中的標(biāo)記的那段是發(fā)生異常情況時的CPU的情況。從CPU圖上可以更加肯定線程是并沒有死掉的,而且進入了無法響應(yīng)的狀態(tài),因此可以判斷出發(fā)生線程死鎖的情況。

線程死鎖     

     死鎖的概念:

  死鎖是進程死鎖的簡稱,是由Dijkstra于1965年研究銀行家算法時首先提出來的。它是計算機操作系統(tǒng)乃至并發(fā)程序設(shè)計中最難處理的問題之一。實際上,死鎖問題不僅在計算機系統(tǒng)中存在,在我們?nèi)粘I钪兴矎V泛存在。

  我們先看看這樣一個生活中的例子:在一條河上有一座橋,橋面較窄,只能容納一輛汽車通過,無法讓兩輛汽車并行。如果有兩輛汽車A和B分別由橋的兩端駛上該橋,則對于A車來說,它走過橋面左面的一段路(即占有了橋的一部分資源),要想過橋還須等待B車讓出右邊的橋面,此時A車不能前進;對于B車來說,它走過橋面右邊的一段路(即占有了橋的一部分資源),要想過橋還須等待A車讓出左邊的橋面,此時B車也不能前進。兩邊的車都不倒車,結(jié)果造成互相等待對方讓出橋面,但是誰也不讓路,就會無休止地等下去。這種現(xiàn)象就是死鎖。如果把汽車比做進程,橋面作為資源,那麼上述問題就描述為:進程A占有資源R1,等待進程B占有的資源Rr;進程B占有資源Rr,等待進程A占有的資源R1。而且資源R1和Rr只允許一個進程占用,即:不允許兩個進程同時占用。結(jié)果,兩個進程都不能繼續(xù)執(zhí)行,若不采取其它措施,這種循環(huán)等待狀況會無限期持續(xù)下去,就發(fā)生了進程死鎖。

 

     上圖是一張描述一個簡單的死鎖模型的圖,首先Thread1鎖定占有資源Y,Thread2鎖定占有資源X,但同時相互向?qū)Ψ秸埱筚Y源,因此都無法釋放自身資源去訪問下一個資源,結(jié)果兩個線程相互阻塞。

死鎖的四個充分必要條件

     從以上分析可見,如果在計算機系統(tǒng)中同時具備下面四個必要條件時,那麼會發(fā)生死鎖。換句話說,只要下面四個條件有一個不具備,系統(tǒng)就不會出現(xiàn)死鎖。

    〈1〉互斥條件。即某個資源在一段時間內(nèi)只能由一個進程占有,不能同時被兩個或兩個以上的進程占有。這種獨占資源如CD-ROM驅(qū)動器,打印機等等,必須在占有該資源的進程主動釋放它之后,其它進程才能占有該資源。這是由資源本身的屬性所決定的。如獨木橋就是一種獨占資源,兩方的人不能同時過橋。

    〈2〉不可搶占條件。進程所獲得的資源在未使用完畢之前,資源申請者不能強行地從資源占有者手中奪取資源,而只能由該資源的占有者進程自行釋放。如過獨木橋的人不能強迫對方后退,也不能非法地將對方推下橋,必須是橋上的人自己過橋后空出橋面(即主動釋放占有資源),對方的人才能過橋。

    〈3〉占有且申請條件。進程至少已經(jīng)占有一個資源,但又申請新的資源;由于該資源已被另外進程占有,此時該進程阻塞;但是,它在等待新資源之時,仍繼續(xù)占用已占有的資源。還以過獨木橋為例,甲乙兩人在橋上相遇。甲走過一段橋面(即占有了一些資源),還需要走其余的橋面(申請新的資源),但那部分橋面被乙占有(乙走過一段橋面)。甲過不去,前進不能,又不后退;乙也處于同樣的狀況。

    〈4〉循環(huán)等待條件。存在一個進程等待序列{P1,P2,...,Pn},其中P1等待P2所占有的某一資源,P2等待P3所占有的某一源,......,而Pn等待P1所占有的的某一資源,形成一個進程循環(huán)等待環(huán)。就像前面的過獨木橋問題,甲等待乙占有的橋面,而乙又等待甲占有的橋面,從而彼此循環(huán)等待。

  上面我們提到的這四個條件在死鎖時會同時發(fā)生。也就是說,只要有一個必要條件不滿足,則死鎖就可以排除。

項目中死鎖的形成與解決

     根據(jù)以上理論,以及斷點調(diào)試,可以分析得項目的形成,如下圖所描述。

因此只要讓同步下載時不會掛起主線程就可以避免線程死鎖的情況發(fā)生。因此項目中使用NSURLConnet的同步請求方法實現(xiàn)下載即可, 因為它不會掛起主線程,還能讓其他線程往主線程中添加代碼塊block。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • iOS開發(fā)中#import、#include和@class的區(qū)別解析

    iOS開發(fā)中#import、#include和@class的區(qū)別解析

    這篇文章主要介紹了iOS開發(fā)中#import、#include和@class的區(qū)別解析,非常不錯,具有參考借鑒價值,感興趣的朋友一起學(xué)習(xí)吧
    2016-08-08
  • 推薦一個非常棒的Titanium MVC框架

    推薦一個非常棒的Titanium MVC框架

    ChariTi是一個非常不錯的Titanium MVC框架。此框架的特點是很多東西可直接通過配置文件實現(xiàn),如APP的主題顏色,每個tab的內(nèi)容,是否使用滑動菜單布局,是否支持tablet布局等,而且其對iOS 和 android也有很好的支持,同時也支持橫屏和豎屏的轉(zhuǎn)換然后使用不同的布局。
    2014-07-07
  • XCode編譯速度慢的處理方法

    XCode編譯速度慢的處理方法

    本文給大家介紹的是在IOS開發(fā)中XCode編譯速度慢的3種解決辦法,十分的實用,有需要的小伙伴可以參考下。
    2015-06-06
  • iOS實現(xiàn)垂直滑動條效果

    iOS實現(xiàn)垂直滑動條效果

    這篇文章主要為大家詳細(xì)介紹了iOS實現(xiàn)垂直滑動條效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 詳解適配iOS10 的相關(guān)權(quán)限設(shè)置

    詳解適配iOS10 的相關(guān)權(quán)限設(shè)置

    在最新版本的iOS10系統(tǒng)中,如果你的項目中訪問了隱私數(shù)據(jù),比如:相機、相冊、錄音、定位、聯(lián)系人等等。涉及到權(quán)限問題,本篇文章主要介紹了適配iOS10 的相關(guān)權(quán)限設(shè)置,有興趣的可以了解一下。
    2016-12-12
  • iOS 點擊推送消息跳到應(yīng)用指定頁面的實例

    iOS 點擊推送消息跳到應(yīng)用指定頁面的實例

    這篇文章主要介紹了iOS 點擊推送消息跳到應(yīng)用指定頁面的實例的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • iOS中的應(yīng)用啟動原理以及嵌套模型開發(fā)示例詳解

    iOS中的應(yīng)用啟動原理以及嵌套模型開發(fā)示例詳解

    這篇文章主要介紹了iOS中的應(yīng)用啟動原理以及嵌套模型開發(fā)示例詳解,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下
    2015-12-12
  • iOS中使用MD5加密字符串

    iOS中使用MD5加密字符串

    本文主要給大家講解的是在IOS中MD5的加密方式,及詳細(xì)使用方法。有需要的小伙伴可以參考下
    2016-06-06
  • iOS實現(xiàn)只有底部邊框線的輸入框示例代碼

    iOS實現(xiàn)只有底部邊框線的輸入框示例代碼

    這篇文章給大家分享了一種利用iOS實現(xiàn)只有底部邊框線的輸入框,其實這個效果也挺常見的,本文給出了示例代碼,下面來看看如何實現(xiàn)這種效果。
    2016-09-09
  • iOS App使用設(shè)計模式中的模板方法模式開發(fā)的示例

    iOS App使用設(shè)計模式中的模板方法模式開發(fā)的示例

    這篇文章主要介紹了iOS應(yīng)用使用設(shè)計模式中的模板方法模式開發(fā)的示例,例子代碼為Objective-C語言,文中還與Java的相關(guān)實現(xiàn)進行類比,需要的朋友可以參考下
    2016-03-03

最新評論