개발콩블로그

[Swift] GCD - 2 스레드 실행 방식 본문

swift

[Swift] GCD - 2 스레드 실행 방식

devBean 2025. 1. 30. 20:37

안녕하세요!

개발콩입니다. 오늘은 동시성 프로그래밍에 대해서 이어서 알아보도록 하겠습니다.

오늘은 GCD를 사용하여 구현할 수 있는 4가지 스레드 실행 방식에 대해 정리해보고자 합니다.

 

 

 

GCD(Grand Central Dispatch)는 iOS에서 멀티스레드 작업을 효율적으로 처리할 수 있도록 도와주는 프레임워크입니다.

GCD에서는 큐(Queue)의 종류와 작업 실행 방식에 따라 총 4가지의 경우의 수가 존재합니다.

 

 

GCD를 사용하여 구현할 수 있는 4가지 경우의 수

  • main Queue(직렬 큐) + sync(동기)
  • main Queue(직렬 큐) + async(비동기)
  • global Queue(동시 큐) + sync(동기)
  • global Queue(동시 큐) + async(비동기)

아래의 예시 코드를 통해 어떤식으로 동작하는지 확인하도록 하겠습니다.

 

 

 

main Queue(직렬 큐) + sync(동기)

for item in 1...100 {
    print(item, terminator: " ")
}

DispatchQueue.main.sync { // 오류 발생 !!!!!
    for item in 101...200 {
        print(item, terminator: " ")
    }
}

// 1, 2, 3, ... 99, 100

 

 

main Queue(직렬 큐) + sync(동기)를 사용하게 된다면 DeadLock 상태가 발생합니다.

main 스레드의 경우 DispatchQueue에게 작업이 끝날때 까지 기다리는 요청을 보낸 상태입니다.

하지만, DispatchQueue의 경우 해당 작업을 main에게 시키고 있습니다.

 

이 과정에서 main은 해당 작업이 끝날 때까지 기다리고 있는 상태에서 DispatchQueue의 작업을 수행할 수 없게 됩니다.

따라서, 교착 상태에 빠지게 됩니다.

 

 

main Queue(직렬 큐) + async(비동기)

DispatchQueue.main.async {
    for item in 1...100 {
        print(item, terminator: " ")
    }
}

for item in 101...200 {
    print(item, terminator: " ")
}

// 101, 102, ... 199, 200, 1, 2, ... 99, 100

 

처음 1부터 100까지 출력 작업의 응답을 기다리지 않고

101부터 200까지 출력되는 작업이 끝난 뒤에 실행되는 것을 확인할 수 있습니다.

 

 

 

global Queue(동시 큐) + sync(동기)

DispatchQueue.global().sync {
    for item in 1...100 {
        print(item, terminator: " ")
    }
}

for item in 101...200 {
    print(item, terminator: " ")
}

// 1, 2, 3, ... 99, 100, 101, 102, ... 199, 200

 

동시 실행이 가능한 global Queue에 1부터 100까지 출력하는 작업이 sync (동기) 방식으로 처리되었기 때문에

해당 작업이 모두 끝난 뒤에 101부터 200까지 출력하는 작업이 시작되는 것을 볼 수 있습니다.

👉 해당 작업은 실제로 Main Thread에서 동작하는 것과 유사하기 때문에 실질적으로 main Thread에서 동작한다고 합니다.

 

 

global Queue(동시 큐) + async(비동기)

DispatchQueue.global().async {
    for item in 1...100 {
        print(item, terminator: " ")
    }
}

for item in 101...200 {
    print(item, terminator: " ")
}

// 101, 102, 103, 104, 105, 1, 2, 3, 4, 5, 106, 107, 108, 109, 110, 6, 7, 8, ...

 

동시 실행이 가능한 global Queue에 1부터 100까지 출력하는 작업이 async (비동기) 방식으로 처리되었기 때문에

101부터 200까지 출력하는 작업은 기다리지 않고 실행하게 됩니다.

 

또한, global Queue에서 작업을 처리하기 때문에 1부터 100까지 출력하는 작업과 101부터 200까지 출력하는 작업이

동시에 진행하게 됩니다.

 

 

 

global Queue(동시 큐) + async(비동기) 처리의 장단점

장점

여러 개의 작업을 하나의 스레드에서 동작하는 것이 아니라 적절하게 여러 스레드에 분배함으로써 동시에 동작하게 됩니다.

즉, 한명이 하는 일을 여러 명이 할 수 있기 때문에 작업이 빠르게 끝날 수 있습니다.

 

단점

하지만 비동기 코드는 작업이 언제 끝날지 모르는 것이 특징이였습니다.

따라서, 여러개의 작업이 모두 언제 종료되었다는 신호를 받기가 어렵습니다.

 

 

이러한 단점을 극복할 수 있는 방법에 대해서 다음 글에서 다시 찾아오도록 하겠습니다.