造成線程鎖死的幾種情況

主隊列添加劑同步任務(wù)


原因:對于主隊列無論是同步異步都不會創(chuàng)建線程,而且主隊列中的任務(wù)只有在主線程空閑的時候才會執(zhí)行.如果是主隊列同步會造成互相等待而鎖死.主隊列同步任務(wù)等待主線程執(zhí)行,主線程之后的任務(wù)等待主隊列任務(wù)完成。

解決辦法:在主隊列外面套一層并發(fā)隊列的異步任務(wù).或者使用主隊列異步任務(wù)

問題代碼:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event

{

NSLog(@"START----START");

//情況1:主隊列同步任務(wù)-----鎖死

dispatch_sync(dispatch_get_main_queue(), ^{

NSLog(@"%@", [NSThreadcurrentThread]);

NSLog(@"鎖死了嗎?");

});

NSLog(@"deadBlock1--END");

NSLog(@"OVER------OVER");

}

運行結(jié)果:

在當前隊列的任務(wù)(無論同步異步)里面,添加當前隊列同步任務(wù),造成鎖死當前線程,該同步任務(wù)之后的任務(wù)不會執(zhí)行


原因:(官方文檔)Do not call the dispatch_sync function from a

task that is executing on the same queue that you pass to your function

call. Doing so will deadlock the queue. If you need to dispatch to the

current queue, do so asynchronously using the dispatch_async function.

說明:以上說法不完全正確,雖然在并發(fā)隊列/全局隊列的任務(wù)里面,添加當前并發(fā)隊列同步任務(wù)不會造成鎖死,但是蘋果官方不建議這樣做.

解決辦法:使用dispatch_async添加異步任務(wù)

問題代碼:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event

{

NSLog(@"START----START");

//會鎖死

dispatch_queue_tqueue=dispatch_queue_create("串行隊列",NULL);

//

dispatch_queue_t queue=dispatch_get_main_queue();

//不會鎖死,不建議使用

//dispatch_queue_t

queue=dispatch_queue_create("并發(fā)隊列",

DISPATCH_QUEUE_CONCURRENT);

//dispatch_queue_t

queue=dispatch_get_global_queue(0, 0);

dispatch_async(queue, ^{

NSLog(@"%@", [NSThreadcurrentThread]);

//在這之后的任務(wù)不會執(zhí)行,因為會該同步任務(wù)會造成死鎖

dispatch_sync(queue, ^{

NSLog(@"鎖死了嗎?");

});

NSLog(@"沒有--沒有--沒有");

});

NSLog(@"deadBlock2--END");

NSLog(@"OVER------OVER");

}

運行結(jié)果

多個NSOperation之間循環(huán)依賴


原因:任務(wù)之間相互等待,造成死鎖

解決辦法:添加依賴的時候特別注意,不要有循環(huán)依賴

問題代碼

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event

{

//創(chuàng)建隊列

NSOperationQueue*queue=[NSOperationQueuenew];

NSBlockOperation*blockOp1=[NSBlockOperationblockOperationWithBlock:^{

[NSThreadsleepForTimeInterval:2];

NSLog(@"我是任務(wù)1--%@", [NSThreadcurrentThread]);

}];

NSBlockOperation*blockOp2=[NSBlockOperationblockOperationWithBlock:^{

[NSThreadsleepForTimeInterval:2];

NSLog(@"我是任務(wù)2--%@", [NSThreadcurrentThread]);

}];

NSBlockOperation*blockOp3=[NSBlockOperationblockOperationWithBlock:^{

[NSThreadsleepForTimeInterval:2];

NSLog(@"我是任務(wù)3--%@", [NSThreadcurrentThread]);

}];

NSBlockOperation*blockOp4=[NSBlockOperationblockOperationWithBlock:^{

NSLog(@"我是任務(wù)4--%@", [NSThreadcurrentThread]);

}];

//注意:千萬不要有循環(huán)依賴:即循環(huán)等待

[blockOp2addDependency:blockOp1];

[blockOp3addDependency:blockOp2];

[blockOp4addDependency:blockOp3];

//循環(huán)依賴,導致相互等待,相互鎖死,所有任務(wù)都不會執(zhí)行

[blockOp1addDependency:blockOp4];

[queueaddOperations:@[blockOp1,blockOp2,blockOp3,blockOp4]waitUntilFinished:NO];

NSLog(@"到這里了嗎");

}

運行結(jié)果

總結(jié)


使用dispatch_sync時候必須要慎重或者少用.如果要順序執(zhí)行可以用串行隊列異步任務(wù)代替

最好不要在當前隊列的任務(wù)里面,添加當前隊列同步任務(wù),會造成當前線程鎖死,導致之后的任務(wù)不會執(zhí)行.特別是當前線程是主線程的時候后果很嚴重.

stackoverflow相關(guān)討論:Posts containing 'dispatch_sync in dispatch_async' - Stack Overflow

福利


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谦铃,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子躏鱼,更是在濱河造成了極大的恐慌剩燥,老刑警劉巖揭保,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件埃叭,死亡現(xiàn)場離奇詭異睁搭,居然都是意外死亡晒他,警方通過查閱死者的電腦和手機吱型,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陨仅,“玉大人津滞,你說我怎么就攤上這事∽粕耍” “怎么了触徐?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長狐赡。 經(jīng)常有香客問我撞鹉,道長,這世上最難降的妖魔是什么颖侄? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任鸟雏,我火速辦了婚禮,結(jié)果婚禮上览祖,老公的妹妹穿的比我還像新娘孝鹊。我一直安慰自己,他們只是感情好展蒂,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布惶室。 她就那樣靜靜地躺著,像睡著了一般玄货。 火紅的嫁衣襯著肌膚如雪皇钞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天松捉,我揣著相機與錄音夹界,去河邊找鬼。 笑死隘世,一個胖子當著我的面吹牛可柿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播丙者,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼复斥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了械媒?” 一聲冷哼從身側(cè)響起目锭,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤评汰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后痢虹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體被去,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年奖唯,在試婚紗的時候發(fā)現(xiàn)自己被綠了惨缆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡丰捷,死狀恐怖坯墨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情病往,我是刑警寧澤畅蹂,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站荣恐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏累贤。R本人自食惡果不足惜叠穆,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望臼膏。 院中可真熱鬧硼被,春花似錦、人聲如沸渗磅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽始鱼。三九已至仔掸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間医清,已是汗流浹背起暮。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留会烙,地道東北人负懦。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像柏腻,于是被迫代替她去往敵國和親纸厉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容