最近在使用信號(hào)量時(shí),遇到了一種死鎖的情況虫蝶。
//在主線程寫(xiě)一段代碼振乏,并運(yùn)行
NSLog(@"1");
dispatch_semaphore_t s = dispatch_semaphore_create(0);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"2");
dispatch_semaphore_signal(s);
});
});
NSLog(@"3");
dispatch_semaphore_wait(s, DISPATCH_TIME_FOREVER);
NSLog(@"4");
2018-02-09 11:27:28.603660+0800 test[10630:7608773] 1
2018-02-09 11:27:28.603941+0800 test[10630:7608773] 3
分析:
1.創(chuàng)建的總信號(hào)量為0,代碼執(zhí)行到dispatch_semaphore_wait時(shí), 主線程阻塞秉扑,直到收到信號(hào)才會(huì)往下繼續(xù)執(zhí)行慧邮;
dispatch_semaphore_signal(s)發(fā)送信號(hào)是放在主線程中執(zhí)行,由于此時(shí)主線程是阻塞的舟陆,那么dispatch_semaphore_signal(s)不會(huì)執(zhí)行误澳,這形成了死鎖的情況。
修改一下代碼如下秦躯,運(yùn)行
NSLog(@"1");
dispatch_semaphore_t s = dispatch_semaphore_create(0);
dispatch_async(dispatch_get_global_queue(0, 0), ^{
dispatch_semaphore_signal(s);
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"2");
});
});
NSLog(@"3");
dispatch_semaphore_wait(s, DISPATCH_TIME_FOREVER);
NSLog(@"4");
2018-02-22 14:44:45.589003+0800 test[631:151335] 1
2018-02-22 14:44:45.589064+0800 test[631:151335] 3
2018-02-22 14:44:45.589112+0800 test[631:151335] 4
2018-02-22 14:44:45.647069+0800 test[631:151335] 2
dispatch_semaphore_signal(s)發(fā)送信號(hào)放在子線程執(zhí)行忆谓,打破了死鎖,代碼正常執(zhí)行了踱承。