iOS 에서의 멀티스레딩 프로그래밍시 주의해야할 점 들
가장 기본적으로는 UI업데이트에 관한 작업들은 메인 스레드(main thread)에서 구현되어야 합니다.
그리고 가장 신경써야될 작업은 스레드에 안전하지 않은(Thread-unsafe) 변수는 서로 다른 스레드에서 동시에 접근하면 위험하기 때문에 해당 작업에 신경을 많이 써야 합니다.
1. Mutable, Immutable
Immutable한 인스턴스는 스레드에 안전(Thread-safe)합니다.
즉, 여러 스레드에서 한번에 접근해도 문제가 되지 않습니다.
Mutable한 인스턴스는 스레드에 안전(Thread-safe)하지 않지만 읽기 전용으로만 사용한다면 문제가 되진 않습니다.
하지만 Mutable한 인스턴스를 하나 이상의 스레드에서 변경이 이루어진다면 문제가 발생합니다.
2. 프로퍼티 속성
프로퍼티 속성에는
1.
atomic : 프로그래밍에서 데이터의 변경이 동시에 일어난 것처럼 보이게 하는 것을 의미합니다. 데이터의 값을 변경하는 것은 항상 그 시간이 필요합니다. atomic 한 데이터의 변경이 이루어지는 시간에는 lock 을 겁니다. 그래서 데이터를 변경하는 시간동안에는 접근이 이루어지지 않게 합니다.
즉, 데이터의 변경이 이루어지고 있는 순간에는 접근이 불가능한 프로퍼티입니다
atomic property 는 항상 serial 하게 접근됩니다!
2.
nonatomic : 반환된 값에 대해 보장하지 않습니다. 이것은 정확한 값일 수도 있지만 쓰레기 값일 수도 있습니다.
이 있습니다.
어떤 프로퍼티를 두 개의 스레드가 참조하고 있는 상황에서 해당 프로퍼티 접근자 메서드가 atomic하지 않는다면 값에 대한 싱크가 맞지 않아 문제가 발생할 수 있습니다. 이런 경우에 atomic으로 설정되어야 합니다.
하지만, Mutable한 인스턴스가 변경 중에 동시 접근할 경우가 없다면 nonatomic으로 사용해도 무방합니다.
3. Synchronized
메소드를 실행할 때 동시에 접근할 수 없도록 막고 싶을 때 해당 부분을 Lock을 걸 수 있습니다.
Lock을 걸어줌으로써 한 스레드에서 해당 부분이 끝낼 때 까지 다른 스레드에서 접근할 수 없게됩니다.
4. GCD
Swift에서 스레드 관련 작업은 Grand Central Dispatch API를 통해 처리합니다.
GCD는 클로저 블록 안에 있는 특정 작업을 큐에 올리고, 해당 큐를 특정 스레드에 실행하는 방식입니다.
애플이 스레드 프로그래밍을 효율적으로 할 수 있게 만들어준 만큼 적절하게 사용하여 Thread-safe하게 구현하는 것이 중요합니다.
5. Class, Struct
클래스는 레퍼런스 타입, 구조체는 값 타입입니다. 즉, 구조체가 파라미터로 전달될 때 스레드에 안전(Thread-safe)합니다.
마무리
멀티 스레드를 사용하여 개발을 할 때에는 스레드에 안전하지 않은(Thread-unsafe) 변수를 사용하고 있다면 변경 중에 동시에 접근하는 경우가 있는지 잘 체크해야합니다.