0

그래서 나는 Facebook의 굉장한 AsyncDisplayKit 소스 코드를 읽고 있습니다. 특히, ASDealloc2MainObject 뒤에있는 구현을 읽습니다. 한 가지는 내 눈을 사로 잡았습니다.메인 큐의 디스패치 배리어

_AS-objc-internal.h, line 423 to 424에는 프로그래머가 일부 작업을 기본 대기열로 보냅니다. 그것은 사용자 동시 큐 취급 않다면

다른 디스패치 배리어 기능의 경우와 마찬가지로
 dispatch_barrier_async_f(dispatch_get_main_queue(), self,   \ 
      _objc_deallocOnMainThreadHelper);        \ 

, dispatch_barrier_async_f()에서 배리어 로직 만 이해된다. 글로벌 동시 대기열과 기본 대기열의 경우에는 dispatch_async_f()처럼 작동하며 장벽은 영향을 미치지 않습니다.

여기 장벽을 사용하는 이유는 무엇입니까?

답변

2

내 실수입니다. 기껏해야, 그들은 의도를 알리려고 노력하고 있으며 프로그래머에게 "이봐,이게 연속적"이라고 상기 시키지만, 꽤 의심스러운 것 같다.

DISPATCH_NOINLINE 
    void 
    dispatch_async_f(dispatch_queue_t dq, void *ctxt, dispatch_function_t func) 
    { 
      dispatch_continuation_t dc; 

      // No fastpath/slowpath hint because we simply don't know 
      if (dq->dq_width == 1) { 
        return dispatch_barrier_async_f(dq, ctxt, func); 
      } 

      dc = fastpath(_dispatch_continuation_alloc_cacheonly()); 
      if (!dc) { 
        return _dispatch_async_f_slow(dq, ctxt, func); 
      } 

      dc->do_vtable = (void *)DISPATCH_OBJ_ASYNC_BIT; 
      dc->dc_func = func; 
      dc->dc_ctxt = ctxt; 

      // No fastpath/slowpath hint because we simply don't know 
      if (dq->do_targetq) { 
        return _dispatch_async_f2(dq, dc); 
      } 

      _dispatch_queue_push(dq, dc); 
    } 
+1

: 전달 된 큐가 dispatch_async_f()implementation은 다음과 같습니다 1.

로 설정 동시성의 폭이있는 경우 후드 dispatch_barrier_async_f()를 호출 dispatch_async_f() : – ipmcc

+0

Apple의 gcd 소스 코드에서 가능한 설명을 발견했습니다. 내 대답을 참조하십시오. 나는 아직도 확실히 확신하지 못한다. –

+0

직렬 대기열에있는 모든 항목은 장벽 항목이며 dispatch_barrier_async_f() 및 dispatch_async_f()는 동일합니다. – das

0

그래서 나는 가능한 설명을 발견했다 나는 동의 할 의향이있다.
관련 문제