美文网首页
我们无需相互等待--GCD的线程

我们无需相互等待--GCD的线程

作者: 看个客人 | 来源:发表于2016-09-22 11:52 被阅读68次

在程序开发中如果要用到线程,第一反应非GCD莫属。感觉只需要弄懂任务,和队列两个概念,一般问题就会迎刃而解。

同步:会阻塞当前线程,直到Block任务结束。

异步:它不会阻塞当前线程。

队列主要分为两种:串行和并行

串行:放到串行的任务,GCD会取出一个,等到这个执行结束,再取出下一个。

并行:放到并行的任务,GCD也是一个一个取出来,但是他不同的是,会把这些任务放到别的线程,速度很快,快到我们以为是同时取出来的。不过需要注意,GCD 会根据系统资源控制并行的数量,所以如果任务很多,它并不会让所有任务同时执行。

系统给我们提供了一个串行队列:

dispatch_queue_t mainqueue = dispatch_get_main_queue();

我向这个队列添加了一个提交了一个串行任务

NSLog(@"同步开始------%@",[NSThread currentThread]);

dispatch_sync(mainqueue, ^{

NSLog(@"%@",[NSThread currentThread]);

});

NSLog(@"同步结束------%@",[NSThread currentThread]);

打印结果如下:

[5330:2817984] 同步开始------{number = 1, name = main}

同步任务会阻塞当前线程的执行,直到该任务结束,否则线程都会一直堵塞下去。很不巧的是,此时GCD不会开辟新的线程,它会把任务放到主线程中执行。因为主线程已经堵塞,该任务也就永远不会被完成。造成这种死锁的原因就是:线程在等待同步任务的完成,而线程确被卡死,这就是所谓的相互等待。令我感到迷惑的是:另外一种串行和同步的结合,我们也可以自己创造串行队列:

dispatch_queue_t queue1 = dispatch_queue_create(nil, DISPATCH_QUEUE_SERIAL);//这里有两个参数第一个参数是代表队列的唯一标示,可以传空,第二个参数表示创建的队列是串行的还是并行的,传入 DISPATCH_QUEUE_SERIAL 或 NULL 表示创建串行队列。

NSLog(@"同步开始------%@",[NSThread currentThread]);

dispatch_sync(queue1, ^{

NSLog(@"%@",[NSThread currentThread]);

});

NSLog(@"同步结束------%@",[NSThread currentThread]);

打印结果;

同步开始------<NSThread:0x13fd0dba0>{number = 1, name = main}

<NSThread:0x13fd0dba0>{number = 1, name = main}

同步结束------<NSThread:0x13fd0dba0>{number = 1, name = main}

错误理解:我以为这种也会造成死锁,结果很明显没有。都是串行队列,提交任务,不同的是一种是主队列,它用于刷新 UI。一种是手动创建的。让人疑惑的是[NSThread currentThread]打印的地址是一样的,让我误以为queue1这种队列,也是将任务提交给了当前执行队列。

正确理解:经过大神的开导,地址一致只不过是线程的重用而已,这两种队列是将任务提交给了不同线程。线程的死锁用大神的话来讲就是dispatch_sync的当前执行队列和提交Block任务的队列一致的时候才会发生。至于Block输出的的线程是主线程,只不过是线程池里面线程的重用。感谢这位作者对GCD的解释

相关文章

  • 我们无需相互等待--GCD的线程

    在程序开发中如果要用到线程,第一反应非GCD莫属。感觉只需要弄懂任务,和队列两个概念,一般问题就会迎刃而解。 同步...

  • 计数器:CountDownLatch,CountDownLatc

    计数器 CountDownLatch: 一个线程等待多个线程。 CyclicBarrier:多个线程相互等待,等待...

  • GCD多线程安全

    在iOS中,多线程编程用得最多的是GCD。与其他平台或语言不同的是,GCD管理了线程的创建、执行和销毁,使用者无需...

  • 关于GCD中的线程数

    前言 gcd用起来很方便,虽说是由系统去控制线程的创建,销毁,调配。我们无需操心。但是滥用的话也会引起线程数量过多...

  • 7.3 多线程-GCD

    多线程-GCD 多线程-GCD-串行并行 多线程-GCD.png GCD-线程的通讯、延时操作、定时器 GCD-线...

  • GCD Timer 和内存泄漏

    更多内容请挪步我的博客 GCD 的 Timer 相对于 NSTimer 更加灵活、高效(无需在主线程和后台线程之间...

  • GCD详解

    GCD是苹果封装的一套C的API,帮助我们能快速使用线程,它可以自动管理线程的创建,调度和销毁等功能,无需开发者自...

  • OC 线程笔记

    GCD: 创建任务,添加到队列,GCD自动分发任务 同步/异步同步任务,异步任务的区别: 线程是否要等待任务结束,...

  • iOS GCD有几种队列

    GCD:其实就是不用我们创建线程池GCD已经帮我们创建好了,他会帮我们创建线程,销毁线程决定着你的代码块将在哪个线...

  • GCD中队列与任务嵌套的组合情况分析

    前言 标题可能有点令人费解,解释一下。众所周知,GCD编程是面向队列和任务的,无需关心线程的创建和维护。GCD中有...

网友评论

      本文标题: 我们无需相互等待--GCD的线程

      本文链接:https://www.haomeiwen.com/subject/vqrzettx.html