美文网首页iOS
GCD执行原理

GCD执行原理

作者: songzhaojie | 来源:发表于2019-04-17 13:53 被阅读84次

今天跟大家分享一下GCD的执行原理,自己也记录一下,别人只知到GCD怎么用,但是一般不知道什么原理,大神勿喷

一,GCD 

1.GCD分串行队列和并行队列(针对队列),执行分为同步和异步(针对线程)

二 开辟新线程

三执行原理

GCD底层有一个线程池,这个线程池存放的是一个个的线程,这个线程池中的线程可以重用,当一段时间这个线程没有被调用就会被销毁,⚠️ 开辟多少线程不是由同步异步决定的而是底层线程池决定的,线程池是系统维护,

四 使用(简单介绍几种)

1.延迟

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

  NSLog(@"after---%@",[NSThread currentThread]);  // 打印当前线程   

  });

2.单例

 static dispatch_once_t onceToken;

   dispatch_once(&onceToken, ^{   

  });

3. 栅栏(可以让A异步执行完毕执行B异步)

dispatch_barrier_async(queue, ^{

        // 追加任务 barrier

        for (int i = 0; i < 2; ++i) {

            [NSThread sleepForTimeInterval:2];              // 模拟耗时操作

            NSLog(@"barrier---%@",[NSThread currentThread]);// 打印当前线程

        }

    });

4.信号量

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

  __blockintnumber =0;

    dispatch_async(queue, ^{

        // 追加任务1

    [NSThread sleepForTimeInterval:2];              // 模拟耗时操作

  NSLog(@"1---%@",[NSThread currentThread]);      // 打印当前线程

 number =100;

  dispatch_semaphore_signal(semaphore);    });

 dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

相关文章

网友评论

    本文标题:GCD执行原理

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