dispath_once内部实现

2020 年 5 月 10 日 星期日(已编辑)
7
这篇文章上次修改于 2020 年 5 月 10 日 星期日,可能部分内容已经不适用,如有疑问可询问作者。

dispath_once内部实现

dispath_once

dispatch_once 实际调用 dispatch_once_f


void dispatch_once_f(dispatch_once_t *val, void *ctxt, void (*func)(void *)){
    
    volatile long *vval = val;
    if (dispatch_atomic_cmpxchg(val, 0l, 1l)) {
        func(ctxt); // block真正执行
        dispatch_atomic_barrier();
        *val = ~0l;
    } 
    else 
    {
        do
        {
            _dispatch_hardware_pause();
        } while (*vval != ~0l);
        dispatch_atomic_barrier();
    }
}

dispatch_atomic_cmpxchg 实际是 __sync_bool_compare_and_swap(p,o,n), 这是LockFree给予CAS的一种原子操作机制,原理就是 如果p==o,那么将p设置为n,然后返回true;否则,不做任何处理返回false

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...