그래서 나는 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()
처럼 작동하며 장벽은 영향을 미치지 않습니다.
여기 장벽을 사용하는 이유는 무엇입니까?
: 전달 된 큐가
dispatch_async_f()
의 implementation은 다음과 같습니다 1.로 설정 동시성의 폭이있는 경우 후드
dispatch_barrier_async_f()
를 호출dispatch_async_f()
: – ipmccApple의 gcd 소스 코드에서 가능한 설명을 발견했습니다. 내 대답을 참조하십시오. 나는 아직도 확실히 확신하지 못한다. –
직렬 대기열에있는 모든 항목은 장벽 항목이며 dispatch_barrier_async_f() 및 dispatch_async_f()는 동일합니다. – das