今天跟大家分享一下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);
网友评论