iOS/Swift 상식

멀티 스레드 구현시 고려해야할 것들

HJ39 2023. 2. 19. 21:07

멀티 스레드

여러 개의 스레드가 동시에 작업을 처리하는 것을 의미한다.

하나의 프로세스 내부에는 여러 개의 스레드가 존재하고, 스레드들은 프로세스의 자원을 공유하고 독립적으로 실행된다.

 

장점

  • 메모리 공간과 시스템 자원 소모가 줄어든다.
  • 프로세스 간 통신 방법에 비해 스레드 간의 통신 방법이 간단하다.

단점

  • 서로 다른 스레드가 데이터와 Heap 영역을 공유하므로 다른 스레드가 사용 중인 변수나 자료구조에 접근하는 경우 이상한 값을 얻을 수 있다.
  • 병목현상으로 인해 성능이 저하될 수 있다.

 

멀티 스레딩 프로그래밍 시 고려해야 할 것

Mutable, Immutable

  • Immutable 인스턴스는 Thread-safe 하다.
  • Mutable 인스턴스는 Thread-safe 하지 않지만 읽기 전용으로 사용한다면 문제 되지 않는다.

프로퍼티 속성

atomic

어떤 프로퍼티를 두 개의 스레드가 참조하고 있는 상황에서 해당 프로퍼티 접근자 메서드가 atomic하지 않는다면 값에 대한 싱크가 맞지 않아 문제가 발생할 수 있습니다. 이런 경우에 atomic으로 설정되어야 합니다. 

 

nonatomic

Mutable한 인스턴스가 변경 중에 동시 접근할 경우가 없다면 nonatomic으로 사용한다.

 

Synchronized

스레드가 동시에 접근할 수 없도록 막고 싶을 때 해당 부분을 Lock을 걸 수 있다.

sync 작업이 끝나는 것을 기다렸다 실행
async 기다리지 않고 바로 실행

 

GCD(Grand Central Dispatch)

Swift에서는 스레드 작업은 GCD API를 통해 처리한다.

GCD는 클로저 블록 안에 특정 작업을 큐에 올리고, 해당 큐를 특정 스레드에 실행하는 방식이다.

 

Class, Struct

struct는 값 타입으로 매개변수로 전달될 때 Thread-Safe하다.

 

 

# 참고한 사이트

  1. https://gwangyonglee.tistory.com/47
  2. https://velog.io/@hayeon/%EB%A9%80%ED%8B%B0-%EC%93%B0%EB%A0%88%EB%93%9C%EB%A1%9C-%EB%8F%99%EC%9E%91%ED%95%98%EB%8A%94-%EC%95%B1%EC%9D%84-%EC%9E%91%EC%84%B1%ED%95%98%EA%B3%A0-%EC%8B%B6%EC%9D%84-%EB%95%8C-%EA%B3%A0%EB%A0%A4%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%EB%B0%A9%EC%8B%9D%EB%93%A4%EC%9D%84-%EC%84%A4%EB%AA%85