OC底层原理24-GCD分析中

一.课程答疑

- (void)wbinterDemo{
    dispatch_queue_t queue = dispatch_queue_create("com.demo.test", DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue, ^{
        NSLog(@"1");
    });
    dispatch_async(queue, ^{
        NSLog(@"2");
    });
    dispatch_sync(queue, ^{ NSLog(@"3"); });
    NSLog(@"0");
    dispatch_async(queue, ^{
        NSLog(@"7");
    });
    dispatch_async(queue, ^{
        NSLog(@"8");
    });
    dispatch_async(queue, ^{
        NSLog(@"9");
    });
    // A: 1230789
    // B: 1237890
    // C: 3120798
    // D: 2137890

}
复制代码

上面的代码打印顺序是选择A 由于串行队列至关于把异步变成同步按顺序执行 dqf_width = 1保证FIFO 异步函数串行队列:开启一条新线程 任务一个接着一个markdown

- (void)wbinterDemo{
    dispatch_queue_t queue = dispatch_queue_create("com.demo.test", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        NSLog(@"1");
    });
    dispatch_async(queue, ^{
        NSLog(@"2");
    });
    dispatch_sync(queue, ^{ NSLog(@"3"); });
    NSLog(@"0");
    dispatch_async(queue, ^{
        NSLog(@"7");
    });
    dispatch_async(queue, ^{
        NSLog(@"8");
    });
    dispatch_async(queue, ^{
        NSLog(@"9");
    });
    // A: 1230789
    // B: 1237890
    // C: 3120798
    // D: 2137890

}
复制代码

若是把串行改成并行的话答案选择AC 由于同步阻塞3确定在0以前 123无序 789无序 异步函数并发队列:开启线程,在当前线程执行任务 任务异步执行,没有顺序,CPU调度有关并发

主队列与全局队列app

Xnip2021-08-10_21-35-32.jpg

死锁现象异步

  • 主线程由于你同步函数的缘由等着先执⾏任务
  • 主队列等着主线程的任务执⾏完毕再执⾏⾃⼰的任务
  • 主队列和主线程相互等待会形成死锁 

二.同步函数死锁

同步函数和异步函数的区别async

可否开辟线程函数

任务的回调是否具有异步性-同步性oop

libdispatch-1271.120.2源码源码分析

同步串行死锁底层源码分析atom

查找dispatch_syn Xnip2021-08-10_22-03-45.jpg 查找_dispatch_sync_f Xnip2021-08-10_22-07-03.jpg 查找_dispatch_sync_f_inlinespa

Xnip2021-08-10_22-08-05.jpg

先看一下_dispatch_barrier_sync_f

Xnip2021-08-10_22-11-56.jpg

查找_dispatch_barrier_sync_f_inline

Xnip2021-08-10_22-12-32.jpg

咱们运行一个demo 发现死锁

Xnip2021-08-10_22-20-04.jpg 死锁最后执行的堆栈先是_dispatch_sync_f_slow

Xnip2021-08-10_22-20-19.jpg

最后执行的是 __DISPATCH_WAIT_FOR_QUEUE__

Xnip2021-08-10_22-20-36.jpg

因此分析刚刚查看的_dispatch_barrier_sync_f_inline 应该走的是 _dispatch_sync_f_slow 查找一下

Xnip2021-08-10_22-24-13.jpg

而后查找 __DISPATCH_WAIT_FOR_QUEUE__

Xnip2021-08-10_22-26-16.jpg

看着里面的日志 和咱们 崩溃的死锁最后执行__DISPATCH_WAIT_FOR_QUEUE__的截图日志是同样的 意味着死锁就在这里 你调用的队列被当前线程持有

咱们先查看一下 dsc->dsc_waiter

Xnip2021-08-10_22-34-57.jpg

咱们查看一下 _dispatch_tid_self()tid

Xnip2021-08-10_22-35-31.jpg

咱们查看一下 _dq_state_drain_locked_by

Xnip2021-08-10_22-36-45.jpg

咱们查看一下 _dispatch_lock_is_locked_by

Xnip2021-08-10_22-37-41.jpg

lock_value ^ tid = 0 & DLOCK_OWNER_MASK 才等于0 lock_value = tid 才等于0

Xnip2021-08-10_22-39-33.jpg dq_statedsc->dsc_waiter 表明这两个值相同才发生死锁 这就是死锁的探究流程

三.同步函数任务同步

同步全局队列并发底层源码分析

Xnip2021-08-10_22-46-25.jpg 咱们先看一个细节_dispatch_sync_invoke_and_complete 这个方法传参以func开头的这个为何这么写

Xnip2021-08-10_22-56-43.jpg

看一下 DISPATCH_TRACE_ARG

Xnip2021-08-10_23-02-24.jpg

把逗号封装到这里 可选

并发到底走的是 _dispatch_sync_f_slow 仍是 _dispatch_sync_recurse 接下来咱们用个demo设置这两个系统断点看怎么走的

Xnip2021-08-10_22-48-55.jpg

运行看结果 Xnip2021-08-10_22-49-45.jpg 而后又走到 _dispatch_sync_function_invoke Xnip2021-08-10_23-10-18.jpg 而后走_dispatch_sync_function_invoke_inline Xnip2021-08-10_23-11-19.jpg 而后_dispatch_client_callout回调 Xnip2021-08-10_23-11-30.jpg

同步并发队列是这么走的流程 Xnip2021-08-10_23-20-06.jpg

四.异步函数分析上

可否开辟线程

函数的异步性

异步并发

查找dispatch_async

Xnip2021-08-11_16-18-46.jpg

进入 _dispatch_continuation_async

Xnip2021-08-11_17-12-04.jpg

进入 dx_push

Xnip2021-08-11_17-12-35.jpg 进入 dq_push

Xnip2021-08-11_17-18-16.jpg 进入 _dispatch_lane_concurrent_push

Xnip2021-08-11_17-19-07.jpg

进入_dispatch_lane_push

Xnip2021-08-11_17-20-18.jpg 进入 dx_wakeup

Xnip2021-08-11_17-20-41.jpg 进入 dq_wakeup

Xnip2021-08-11_17-21-52.jpg 进入 _dispatch_lane_wakeup

Xnip2021-08-11_17-22-22.jpg

进入 _dispatch_lane_barrier_complete

Xnip2021-08-11_17-24-38.jpg

进入 _dispatch_lane_class_barrier_complete

Xnip2021-08-11_17-25-39.jpg

os_atomic_rmw_loop2o递归执行完会进入 _dispatch_root_queue_push

Xnip2021-08-11_17-28-33.jpg 进入_dispatch_root_queue_push_inline

Xnip2021-08-11_17-29-08.jpg

进入 _dispatch_root_queue_poke

Xnip2021-08-11_17-29-53.jpg 进入_dispatch_root_queue_poke_slow

Xnip2021-08-11_17-30-24.jpg

五.单例底层原理

待补充

六.异步函数分析下

待补充

相关文章
相关标签/搜索