2014-07-15 5 views
4
  1. 하나의 스레드에 하나의 대기열 만 있습니까?
  2. globalQueue에 비동기 적으로 블록을 디스패치하면 아무래도 주 스레드에서 실행할 수 있습니까?
  3. dispatch_sync은 어떤 상황에서 데드 록이 발생합니까?

답변

2

1. 하나의 스레드에만 하나의 대기열이 포함되어 있습니까?

관계는 한 가지 방법입니다. 직렬 대기열은 스레드가 전달 된 블록을 실행하기 위해 보유 할 수 있지만 스레드는 대기열을 알지 못합니다. 음, 메인 쓰레드는 특별하다. 메인 큐를 알고있다.

내 생각은, 내가 파견 큐 많은 스레드를 포함하는 스레드 풀을 관리하는 생각에 블록 또는 기능을 실행할 스레드를 표시하지 않습니다

파견 큐, 그것은 하나 개의 유휴 스레드 때를 가져옵니다 블록이 전달됩니다. 따라서 하나의 쓰레드가주기 시간 동안 많은 디스패치 큐에서 작동 할 수 있습니다.

블록을 큐로 보내면이 블록이 실행중인 스레드가 결정된 하나의 디스패치 큐에서 작동하므로 dispatch_get_current_queue을 사용하여 얻을 수 있습니다.

2. 블록을 globalQueue에 비동기 적으로 보내면 아무 때나 메인 스레드에서 실행할 수 있습니까?

나는 그것이 오랜 시간 작업 인 경우, 그것은 메인 스레드를 차단, 블록의 실행 시간을 평가할 수 없기 때문에, 주 스레드에서 globalQueue 어떤 블록을 실행하지 것이라 생각합니다.

3. 어떤 상황에서 dispatch_sync가 데드 록을 유발합니까?

나는 당신은 dispatch_sync 또는 함수에 전달하는 을 계획하고 동일한 대기열에서 실행중인 작업에서 dispatch_sync_f 기능 를 호출해서는 안 Concurrency programming guide

단락을 참조합니다. 이는 교착 상태가 발생하는 연속 대기열에서 특히 중요하지만 동시 대기열의 경우에는 도 피해야합니다.

+0

# 2도 마찬가지입니다. 그렇지 않으면 globalQueue의 주 스레드에서 실행중인 대기열의'dispatch_sync (dispatch_get_main_queue ...')를 사용하여 교착 상태 (# 3)를 쉽게 만들 수 있기 때문입니다. – Xyand