본문 바로가기
[Objective-C] 병렬 프로그래밍 [Objective-C] 병렬 프로그래밍 출처 : OS X 구조를 이해하면서 배우는 Objective-C Chap 19. 19.1. 멀티 스레드 * 19.1.1. 스레드의 기본 개념 -스레드(thread)란 프로세스(process)안에서 CPU 이용권을 가진 가상적인 실행 단위이다.일반적으로 하나의 프로세스에는 하나의 스레드밖에 없지만 복수의 스레드를 생성해 프로세스 안에서 병렬로 동작시킬 수도 있다. -프로그램 실행이 시작될 때부터 동작하는 스레드를 메인 스레드라 하고 그 외에 나중에 생성된 스레드를 세컨더리 스레드(secondary thread) 또는 서브 스레드(subthread)라고 한다. -부모 스레드는 자식 스레드의 실행이 끝나길 기다렸다 합류(join)할 수 있다.대다수의 스레드 구현은 따로.. 2018. 1. 10.
[Objective-C] 블록 객체 [Objective-C] 블록 객체 출처 : OS X 구조를 이해하면서 배우는 Objective-C Chap 14. Notice : 정리자(돼지왕 왕돼지)가 remind 하고 싶은 내용이나 모르는 내용 기반으로 정리하는 것이기 때문에 구체적인 내용은 책을 사서 보시기를 권장드립니다. 14.1. 블록 객체란 * 14.1.1. C 컴파일러와 GCD -다른 프로그래밍 언어에서는 클러져 (closure)라고 하는 기능에 해당한다. -Mac OS X 10.6 및 iOS 4 부터 멀티 코어에서 스레드가 더 효율적으로 동작하도록 그랜드 센트럴 디스패치(GCD : Grand Central Dispatch)라는 구조 도입 * 14.1.2. 블록 객체 정의 -^ 부터 인수열, 본체의 마지막 괄호가 나올 떄까지의 블록 객체.. 2018. 1. 6.
[Effective Objective-C] 목차와 요약을 통해 한 눈에 알아보는 Effective Objective-C #41 ~ #48 [Effective Objective-C] 목차와 요약을 통해 한 눈에 알아보는 Effective Objective-C #41 ~ #48 출처 : Effective Objective-C #41 : 동기화에는 락보다는 디스패치 큐를 사용하라 동기화 문법을 제공하기 위해 디스패치 큐를 사용할 수 있다. 그리고 그냥 간단하게 @synchronized 블록이나 NSLock 객체를 이용해 동기화를 제공할 수도 있다. 동기화와 비동기화 디스패치를 함께 사용하는 것은 일반적인 락으로 하는 동기화와 동일한 기능을 제공할 수 있지만, 스레드에서 비동기 디스패치로 호출하면 잠금 없이 호출한다. 병렬 큐와 배리어 블록을 이용하면 동기화를 좀 더 효율적으로 할 수 있다. #42 : performSelector 메서드군보다는 .. 2017. 10. 16.
[Effective Objective-C] #46 dispatch_get_current_queue 사용을 피하라 [Effective Objective-C] #46 dispatch_get_current_queue 사용을 피하라 출처 : Effective Objective-C -GCD 를 사용하면서 특히 여러 큐에 디스패칭할 때 어떤 큐가 현재 실행되고 있는지 알아내야 하는 경우가 흔히 있다.dispatch_queue_t dispatch_get_current_queue() 이 함수가 하는 일은 현재 실행되고 있는 큐를 반환하는 것이라고 문서에 나와 있다.그러나 주의 깊게 다루어야 한다.사실 이 함수는 iOS 6.0 에서 공식적으로 폐기되었다.그러나 맥 OS X 10.8에서는 폐기되지 않았다.그렇다 하더라도 맥 OS X 에서도 사용을 피해야 한다. -이 메서드를 흔히 사용하게 되는 전형적인 안티패턴(anti patter.. 2017. 10. 13.
[Effective Objective-C] #45 스레드 안전한 단일 시간 코드 실행은 dispatch_once 를 이용하라 [Effective Objective-C] #45 스레드 안전한 단일 시간 코드 실행은 dispatch_once 를 이용하라 출처 : Effective Objective-C -싱글턴 디자인 패턴은 보통 shared instance 라는 클래스 메서드를 통해 구현된다.이는 매번 새로운 인스턴스를 할당하는 대신 클래스의 싱글턴 인스턴스를 반환한다.@implementation EOCClass + (id)sharedInstance{ static EOCClass *sharedInstance = nil; @synchronized(self){ if ( !sharedInstance){ sharedInstance = [[self alloc] init]; } }} @end -싱글턴의 화재는 스레드 안전에 대한 것이다.싱글.. 2017. 10. 10.
[Effective Objective-C] #44 플랫폼 확장의 이점을 얻으려면 디스패치 그룹을 사용하라 [Effective Objective-C] #44 플랫폼 확장의 이점을 얻으려면 디스패치 그룹을 사용하라 출처 : Effective Objective-C -플랫폼 확장이라 함은 CPU 의 다수의 코어를 자동으로 활용하는 이점 -디스패치 그룹은 그룹 작업을 쉽게 할 수 있게 하는 GCD 기능이다.이 기능을 사용해 작업들이 모두 끝나기를 기다리거나 작업들이 모두 끝났을 때 콜백을 통해 알림을 받을 수 있다.이 기능은 몇 가지 이유 때문에 매우 유용하다.이점 중 첫 번째이자 가장 흥미로운 것은 다수의 작업이 병렬로 수행되길 원하고 모든 작업이 언제 끝났는지 알고 싶을 때다. 다음 함수로 디스패치 그룹을 생성할 수 있다.dispatch_group_t dispatch_group_create(); -그룹은 식별자가.. 2017. 10. 9.
[Effective Objective-C] #43 GCD 가 필요한 때와 작업 큐가 필요한 때를 구분해서 알아두라 [Effective Objective-C] #43 GCD 가 필요한 때와 작업 큐가 필요한 때를 구분해서 알아두라 출처 : Effective Objective-C -GCD 는 환상적인 기술이지만 표준 시스템 라이브러리의 일부분인 도구들을 사용하는 것이 더 좋을 때가 있다.언제 그런 도구를 사용해야 하는지 반드시 알고 있어야 한다.도구를 잘못 사용하면 유지 보수하기 어려운 코드가 되기 쉽기 때문이다. -백그라운드로 일을 수행하는 최선의 방법이 항상 GCD 를 사용하는 것이 아니다.관련 있는 기술이지만 별개인 NSOperationQueue 는 선택적으로 병렬로 동작하는 큐 관련 작업을 할 수 있게 한다.(NSOperation 의 하위 클래스) -알아야 할 첫 번째 차이점은 GCD 는 순정 C API 라는 것.. 2017. 10. 8.
[Effective Objective-C] #42 performSelector 메서드군보다는 GCD 를 사용하라 [Effective Objective-C] #42 performSelector 메서드군보다는 GCD 를 사용하라 출처 : Effective Objective-C -performSelector 는 다음과 같이 사용한다.- (id)performSelector:(SEL)selector 이 메서드를 통해 선택자를 호출하는 것과 그냥 선택자를 직접 호출하는 것은 기능적으로 같은 것이다. 즉, 아래 두 코드는 같은 내용이다.[object performSelector:@selector(selectorName)];[object selectorName]; -이 메서드들의 진정한 능력은 선택자를 실행 시간에 결정할 수 있는 데서 비롯된다.이러한 동적 바인딩의 가장 큰 능력은 다음과 같은 일을 할 수 있다는 것이다.SEL .. 2017. 10. 7.
[Effective Objective-C] #41 동기화에는 락보다는 디스패치 큐를 사용하라 [Effective Objective-C] #41 동기화에는 락보다는 디스패치 큐를 사용하라 출처 : Effective Objective-C -다수 스레드에서 동시에 접근하기 때문에 문제를 겪는 코드를 오브젝티브-C에서 가끔 발견할 수 있다.이 문제를 해결하기 위해서는 앱이 락을 사용해 동기화해야 한다.GCD 이전에는 동기화를 위한 두 가지 방법이 있었는데 첫 번째 방법은 built-in 동기화 블록이다.- (void) synchronizedMethod{ @synchronized(self){ // 코드 }} 이 구조는 주어진 객체를 기반으로 락을 자동으로 생성하고 블록에 포함된 코드가 완료될 때까지 락을 잡고 기다린다.락은 코드 블록의 끝에서 풀린다. -또 다른 방법은 NSLock 객체를 직접 사용하는 .. 2017. 10. 6.
반응형