본문 바로가기
ios

DispatchQueue 교착상태

by 고고 2021. 12. 22.

Deadlock(교착상태)는 깜직하게도 EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)라는 오류를 만들어 앱을 터트립니다. 교착상태를 막아야겠죠?

 

이런 교착상태가 일어나는 상황을 직렬 큐일 때, 동시 큐일 때로 나누어보면,

 

 

1. Serial(직렬) Queue

- async 속 sync

DispatchQueue.main.async { // main queue ==  serial
    DispatchQueue.main.sync {
        // 교착상황!!
    }
}

 

해결법 : 다른 큐에서 async로 사용하세요.

sync로 하면 교착상태가 또 나니까 주의하세유 -> 참조 : https://gogo-ios.tistory.com/46

DispatchQueue.global().async { // concurrent든 serial이든 상관없습니다.
    // UI 업데이트 전 실행되는 코드
    DispatchQueue.main.sync {
        // UI 업데이트
    }
    // UI 업데이트 후 실행되는 코드
}

 

 

- sync 속 sync

DispatchQueue.main.sync { // main queue ==  serial
    DispatchQueue.main.sync {
        // 교착상황!!
    }
}

 

2. Concurrrent(동시) Queue

Concurrent Queue의 특징은 Serial Queue와 다르게 교착상황이 무조건 일어나는 것이 아닌 가능성만 가지고 있다는 것입니다.

task를 할당할 수 있는 스레드가 여러 개이기 때문에 sync로 block된 스레드에 할당을 할지, 다른 스레드에 접근을 할 지는 모르는 일이기 때문입니다.

 

 

- async 속 sync

DispatchQueue.global().async { // global queue == concurrent
    DispatchQueue.global().sync {
        // 교착상황 가능성 있음. (반드시는 아님.)
    }
}

 

- sync 속 sync

DispatchQueue.global().sync { // global queue == concurrent
    DispatchQueue.global().sync {
        // 교착상황 가능성 있음. (반드시는 아님.)
    }
}

 

 

요약 - 둘 다 같은 큐일 때

async와 sync 속 sync -> 교착상황 O

async와 sync 속 async -> 교착상황 X

댓글