笔记整理 之 Block 阻塞主线程 解析

作者:操作系统

iOS dispatch_sync(dispatch_get_main_queue(), ^{ });死锁原因

1:

- (void)viewDidLoad {

//dispatch_sync(dispatch_get_main_queue(), ^{
//NSLog(@3);
//死锁原因
//1:dispatch_sync在等候block语句推行到位,而block语句要求在主线程里实践,所以dispatch_sync若是在主线程调用就能够形成死锁
//2:dispatch_sync是一道的,本身就能阻塞当前线程,也即主线程。而又往主线程里塞进去三个block,所以就能爆发死锁。
//});
//dispatch_async(dispatch_get_global_queue(), ^{
//async 在主线程中 成立了三个异步线程 加入 全局并发队列,async 不会等待block 实践到位,立时赶回

NSLog(@2);//不会招致死锁;

});

}

解析这段代码:view DidLoad 在主线程中,也即dispatch_get_main_queue()中,执行到sync时向dispatch_get_main_queue()插入同步thread,sync会等到背后的block实践到位才回到。sync又在主队列里面,是个串行队列,sync是前面才参预的,前者是主线程,所以sync想进行block必须等待前一个主线程施行到位,而主线程却

在等候sync再次回到,去实施后续工作,进而导致死锁。

2:

dispatch_sync 和 dispatch_async 区别:

dispatch_async(queue,block) async 异步队列,dispatch_async 函数会立时赶回, block会在后台异步实行。
dispatch_sync(queue,block) sync 同步队列,dispatch_sync 函数不会立刻重返,即阻塞当前线程,等待 block同步实行到位。

3:

 

GCD Queue 分为三种:

1,The main queue :主队列,主线程就是在个类别中。

2,Global queues : 全局并发队列。

3,用户队列:是用函数 dispatch_queue_create 创制的自定义队列

 

dispatch_sync(dispatch_get_main_queue(), ^{ });死锁原因 1: - (void)viewDidLoad { //dispatch_sync(dispatch_get_main_queue(), ^{ //NSLog(@3); //死锁原因 //1:dispatch_sy...

GCD 虽相比NSOpretion 无法提供 打消职分的成效,确因方便而有力广受垂怜。

async 异步队列,dispatch_async 函数会立时回到, block会在后台异步推行。


致使死锁,sync 等待mainThread 推行到位, mianThread 等待sync 函数再次来到。

下面例子就不会,

  1. 由此, 当前queue是串行队列的时候

    NSLog(@"==========阻塞主线程");

图片 1


}

dispatch_sync 会把 块里面的内容放到一个线程里面,然后把线程参加到主线程中,

第三种景况:

先后会产生实施,为啥不会产出死锁。

上边例子就是此前面试的考题:

});

    NSLog(@"=================4");


dispatch_async(queue, ^{

尽管打断了主线程,2 中的sync 就不能推行啦,mainThread 长久不会脱离, sync 就永恒等待着,

NSLog(@"=================2");的块会等待主线程实现再实践,所以会阻塞异步的dispatch_get_global_queue。

});

        NSLog(@"=================2");

dispatch_get_global_queue, 在全局并发线程中投入,与主线程并发运营。

dispatch_sync(queue1, ^{

dispatch_get_main_queue() 中,执行到sync 时 向

2014-11-30 17:56:22.296 Test[6108:379350] =================1

dispatch_queue_t queue = dispatch_queue_create("com.baizhong.queue1", DISPATCH_QUEUE_CONCURRENT);

打字与印刷如下:


会卡住当前线程(在这种情况是主线程), 而主线程被堵塞之后,  因为dispatch_sync把block放到了主线程的队尾, 因而, 主线程须求等dispatch_sync函数重临之后才会继续实施下去, 也正是去施行block,  而dispatch_sync 供给block施行完毕才再次来到.  因而,  这一年就能够导致死锁难点,

GCD Queue 分为两种:

2014-11-30 17:56:22.296 Test[6108:379231] ==========阻塞主线程

上边就不会了

    dispatch_sync(dispatch_get_main_queue(), ^{

2,Global queues : 全局并发队列。

总计:  主因就在于dispatch_sync所在的线程和函数内定的线程是同二个线程,且是串行的.  而串行队列试行尺度是二个完毕在实行下三个的. 那就好比, 大家去某地买房,  可是买房急需先有户籍,  而想要户口却一定要有房屋. 那就导致了您百多年都不可能在这地点买房了.  类比大概有一点点有个别不对劲, 可是大借使以此意思. 驾驭就好

- (void)viewDidLoad

viewDidLoad 在主线程运维,

以致死锁的要害缘由尽管,在某叁个串行队列中, 同步的向那一个行列增加block.

dispatch_sync(queue,block)  sync 同步分发,顺序实践,dispatch_sync 函数不会即时赶回,插入到当下线程,等待 block同步推行到位。

    NSLog(@"=================2");

地点这段代码也会死锁

});

打字与印刷结果:

NSLog(@"3");

2,Global queues : 全局并发队列。

sync 同步队列,dispatch_sync 函数不会应声赶回,及阻塞当前线程,等待 block同步试行到位。

小结起来正是:

    NSLog(@"========2==梗阻主线程");

3,用户队列:是用函数 dispatch_queue_create 创造的自定义队列

dispatch_async(queue1, ^{

本文由ca88发布,转载请注明来源

关键词: ca88网址 日记本 ca88电脑网页 iOS学习笔记 About iOS