iOS 线程的一些知识点

关于开辟线程的开销

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
});

你可能感兴趣的:(iOS 线程的一些知识点)