Programming/Mac & iOS

[iOS] 스레드(Thread) 사용법 & Tips

MB Brad KWON 2016. 4. 24. 17:58

Thread 대용

    Thread는 concurrency를 지원하는 방법 중 상대적으로 low-level이며 복잡한 방법이다. thread를 사용할 때 설계에 만전을 기하지 않는다면 동기화와 타이밍 문제에 직면하게 될 것이다. 또 thread를 굳이 써야할 정도의 task인지를 확실하게 정의해야 한다. thread는 CPU와 메모리에 어마어마한 overhead를 부여하게된다. 굳이 이런 overhead를 감내할 필요가 없다면 아래 설명하는 thread의 대용품들을 사용하자.



-Operation objects

    NSOperation & NSOperationQueue


-Grand Central Dispatch (GCD)

    Grand Central Dispatch


-Idle-time notifications

    NSNotificationQueue에 Notification을 넣고 idle-time 옵션을 준다. 해당 NSNotificationQueue는 run loop가 idle 상태가 되었을 때, notification을 전달하여 수행한다.


-Asynchronous functions

    Cocoa API상에서 함수 자체가 asynchronous excution을 하게 설계된 것들이 있다. 이들을 thread 대용으로 활용할 수 있다.


-Timers

    NSTimer나 CFRunLoopTimer를 사용하면 thread를 사용하기에 너무 하찮은 작업들을 주기적으로 반복 동작 시킬 수 있다.


-Separate processes






Thread 구현


Cocoa threads

    NSThread 클래스를 통하여 구현한다. 또는 NSObject 클래스에서 'performSelectorInBackground:withObject:' 메소드를 사용하여 새로운 thread에 실행 로직을 부여할 수 있다.


POSIX threads

    POSIX thread는 thread를 생성하기 위한 C기반의 인터페이스이다. Cocoa application을 구현하지 않는다면 POSIX thread가 thread를 사용할 수 있는 가장 손쉬운 방법이 될 것이다.


Multiprocessing Services

    이는 오래된 방식으로 OS X에서만 사용 가능하다. 



*POSIX (Portable Operating System Interface) : 서로 다른 UNIX OS의 공통 API를 정리하여 이식성 높은 유닉스 응용 프로그램을 개발하기 위한 목적으로 IEEE가 책정한 애플리케이션 인터페이스 규격.




Inter-thread Communication


Direct messaging

    다른 thread에게 seletor를 수행하게 만들 수 있다. 이 방식을 통하여 해당 thread에 메시지를 전달할 수 있다.


Global variables, Shared memory & objects

    thread 사이에 전역 변수, 공유 객체, 메모리 shared block을 이용하여 정보를 교환할 수 있다. 이 방법은 다른 통신 방법에 비해 단순하고 빠르지만 동기화 문제에 대한 무결성을 보장해야 한다. 이를 보장하지 못할 경우엔 race condition, 데이터 오류, crash 등의 문제를 발생시킬 수 있다.


Conditions

    condition은 thread가 코드의 일부분을 제어하기 위한 동기화 수단이다. 


Run loop sources

    =업데이트 예정=


Ports & sockets

    =업데이트 예정=


Message queues

    데이터를 넣고 빼기 쉬운 추상적 구조의 큐이다. 메시지 큐는 단순하고 편리하지만 다른 communication에 비해 효율적이지 않다.


Cocoa distributed objects

    =업데이트 예정=




Design Tips


-Thread의 직접 생성을 피해라

-Thread를 계속 일하게 만들어라

-공유 데이터 구조를 피해라

-User Interface는 main-thread에서 관리해라

-예외 처리를 명확하게 해라

-Thread를 없앨 때는 명확하게 해라

-Thread-safe를 보장하는 라이브러리를 사용해라


'Programming > Mac & iOS' 카테고리의 다른 글

[iOS] App Extensions in iOS  (0) 2016.04.30
[iOS] Automatic Retain Counting (ARC) in Objective-C & Swift  (0) 2016.04.28
[iOS] NULL, nil, Nil, NSNull  (0) 2016.04.21
[iOS] self와 _의 차이  (0) 2016.04.21
[iOS] KVC, KVO  (0) 2016.04.19