iOS_dispatch_sync同步实现/死锁

  • dispatch_sync方法实现调用

dispatch_sync(参数) {
   
   
	uintptr_t dc_flags = DC_FLAG_BLOCK;
	// 特殊情况判断并处理
	if (unlikely(_dispatch_block_has_private_data(work))) {
   
   
		//	特殊处理,参考_dispatch_sync_block_with_privdata代码块
		return _dispatch_sync_block_with_privdata(dq, work, dc_flags);
	}
	// 调用方法 _dispatch_sync_f()
	_dispatch_sync_f(参数) {
   
   
		_dispatch_sync_f_inline(参数){
   
   
			// 串行 来到这里
			if (likely(dq->dq_width == 1)) {
   
   
				// 栅栏
				return _dispatch_barrier_sync_f(参数){
   
   
					_dispatch_barrier_sync_f_inline(参数){
   
   
						// 参考 _dispatch_barrier_sync_f_inline代码块内容
					}
				}
			}
			....其他情况处理
		}
	}
}

  • dispatch_sync代码块
void
dispatch_sync(dispatch_queue_t dq, dispatch_block_t work)
{
   
   
	uintptr_t dc_flags = DC_FLAG_BLOCK;
	if (unlikely(_dispatch_block_has_private_data(work))) {
   
   
		return _dispatch_sync_block_with_privdata(dq, work, dc_flags);
	}
	_dispatch_sync_f(dq, work, _dispatch_Block_invoke(work), dc_flags);
}
  • _dispatch_sync_f代码块
static void
_dispatch_sync_f(dispatch_queue_t dq, void *ctxt, dispatch_function_t func,
		uintptr_t dc_flags)
{
   
   
	_dispatch_sync_f_inline(dq, ctxt, func, dc_flags);
}

  • _dispatch_sync_f_inline代码块
static inline void
_dispatch_sync_f_inline(dispatch_queue_t dq, void *ctxt,
		dispatch_function_t func, uintptr_t dc_flags)
{
   
   
	
	// 串行 来到这里
	if (likely(dq->dq_width == 1)) {
   
   
		// 栅栏
		return _dispatch_barrier_sync_f(dq, ctxt, func, dc_flags);
	}

	if (unlikely(dx_metatype(dq) != _DISPATCH_LANE_TYPE)) {
   
   
		DISPATCH_CLIENT_CRASH(0, "Queue type doesn't support dispatch_sync");
	}

	dispatch_lane_t dl = upcast(dq)._dl;
	// Global concurrent queues and queues bound to non-dispatch threads
	// always fall into the slow case, see DISPATCH_ROOT_QUEUE_STATE_INIT_VALUE
	if (unlikely(!_dispatch_queue_try_reserve_sync_width(dl))) {
   
   
		return _dispatch_sync_f_slow(dl, ctxt, func, 0, dl, dc_flags);
	}

	if (unlikely(dq->do_targetq->do_targetq)) {
   
   
		return _dispatch_sync_recurse(dl, ctxt, func, dc_flags);
	}
	_dispatch_introspection_sync_begin(dl);
	_dispatch_sync_invoke_and_complete(dl, ctxt, func DISPATCH_TRACE_ARG(
			_dispatch_trace_item_sync_push_pop(dq, ctxt, func, dc_flags)));
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值