关于开辟线程的开销
iOS下主要成本包括:内核数据结构(大约1KB)、栈空间(子线程512KB、主线程1MB)
GCD线程死锁
//前提是在主线程中
dispatch_sync(dispatch_get_main_queue(), ^{
//code
});
死锁的原因如下图:
任务之间的相互等待.png
还有一种情况,就是同样在主线程中,同步调用手动创建的串行队列,是否会引发死锁?为什么? 代码如下:
//前提也是在主线程中
dispatch_queue_t queue = dispatch_queue_create("sync.queue", nil);
dispatch_sync(queue, ^{
//code
});
那么这种情况是否会产生死锁呢?答案是不会,原因如下图:
不会死锁的原因
关于dispatch_barrier_sync
我们需要注意的地方是第一个参数所需要的队列,必须是手动创建的并行队列,这样dispatch_barrier_sync
才会等待处于自己前面的任务执行完毕后,抢占资源执行自己,等自己执行完毕后,队列中的后续任务才能执行。
如果使用dispatch_get_global_queue
进行一个并行队列的获取,那么整个队列中的任务会并行执行,dispatch_barrier_sync
也不会等待队列中处于自己前面的任务执行完毕,处于它后面的任务也不会等待dispatch_barrier_sync
任务执行完毕,整个队列的任务会并行执行。
dispatch_queue_t queue = dispatch_queue_create("sync.queue", DISPATCH_QUEUE_CONCURRENT);
dispatch_barrier_sync(queue, ^{
//code
});
网友评论