[iOS] 동시성 프로그래밍(12) - Actors
2023. 2. 22. 18:23
iOS/iOS
Data Race는 shared mutable data에 대해 여러 Thread에서 동시에 접근하여 발생한다. 동시성 환경에서 자주 발생하는 문제 중 하나이지만, Debug 하기는 어렵다. class Counter { var value = 0 func increment() -> Int { value += 1 return value } } let counter = Counter() Task.detached { print(counter.increment()) } Task.detached { print(counter.increment()) } 해당 코드에서, counter의 0인 상태에 동시에 접근하게 되어 둘 다 1의 결과가 출력될 수도, value += 1 코드에 동시에 접근하게 되어 둘 다 2의 결과가 ..
[iOS] 동시성 프로그래밍(11) - Unstructured Concurrency
2023. 2. 22. 18:15
iOS/iOS
저번 포스팅에서 살펴보았던 Structured Concurrency는 Task는 부모 - 자식 관계를 통해 계층구조로 이루어져 있다. 하지만, 특정 Task에는 structured pattern이 없는 경우가 있다. 대표적인 예로, 동기 context에서 실행되는 비동기 작업들은 Parent Task가 존재하지 않는다. 이러한 경우에 Swift에서는 Unstructured Concurrency를 제공한다. Unstructured Concurrency Unstructured Task들은 life time이 그들의 scop보다 오래 존재할 수 있다. 이미지를 다운로드 Task가 있고, 이 Task를 중간에 cancel 시켜 다운로드를 취소시킬 수 있는 기능을 제공할 수 있다. 또한, Parent Task가 ..
[iOS] 동시성 프로그래밍(9) - async, await
2023. 2. 12. 23:26
iOS/iOS
async와 await는 Swift5.5에서 추가된 Concurrency Model로 더 safe, easy, fast 하게 다루기 위해 나온 기능이다. call-back기반의 비동기 함수의 문제점 기존의 비동기 작업이 끝나는 시점을 completion handler를 통해 알 수 있었는데, 이는 procedual(절차적인) 코드가 아니게 되기에 읽기 어려운 부분이 있다. 썸네일을 가져오는 fetchThumbnail 함수가 있다고 정의해 보자. fetchThumbnail 함수 내부에서 위와 같은 작업들이 진행된다. 이 중, dataTask와 preapreThumbnail은 오래 걸리는 작업이기에 비동기 작업으로 진행되어야 한다. 또한, dataTask의 return 값이 이후의 과정에서 쓰이기 때문에, ..
[iOS] 동시성 프로그래밍(5) - DispatchSemaphore
2023. 1. 4. 21:35
iOS/iOS
Semaphore동시성 프로그래밍에서는 여러 작업들이 공유 자원을 사용하기 때문에, 여러가지 문제가 발생한다. 이러한 문제들은 둘 이상의 작업들이 공유자원에 접근하면 문제가 생기는 코드 영역인 Critical Section에서 발생하는데, 공유자원에 접근하여 발생하는 문제 중 하나로 두 작업의 접근 순서에 따라 결과가 바뀌는 문제가 있다.for _ in 1...5 { let group = DispatchGroup() var someNumber = 10 DispatchQueue.global().async(group: group) { someNumber *= 10 } DispatchQueue.global().async(group: group) { ..
[iOS] 동시성 프로그래밍(4) - DispatchWorkItem
2023. 1. 4. 17:28
iOS/iOS
기존의 DispatchQueue에서의 작업은 다음과 같이 클로저 형태로 작성하였다. DispatchQueue.global().sync { task(1) task(2) } DispatchQueue.global().async { task(1) task(2) } 하지만, 같은 작업이 반복되는 경우 똑같은 코드를 작성해야 하는데, DipsatchWorkItem을 사용하면 작업들을 캡슐화하여 재사용성을 늘릴 수 있다. DispatchWorkItem DispatchWorkItem은 작업들을 캡슐화 할 수 있는데, 사용은 다음과 같다. let workItem = DispatchWorkItem { task(1) task(2) } DispatchQueue.global().async(execute: workItem) Di..
[iOS] 동시성 프로그래밍(2) - GCD(Grand Central Dispatch)
2023. 1. 2. 23:34
iOS/iOS
지난 포스팅에서 "iOS는 GCD, NSOperation를 통해 멀티쓰레딩을 통한 동시성 프로그래밍을 지원한다" 언급하였는데, 이 중 GCD에 대해 이번 포스팅에서 알아보자. 우선 GCD는 애플에서 제공하는 "멀티 쓰레딩" 처리를 쉽고 편하게 해주는 API이다. 또한 "큐에 넣기만 하면 알아서 쓰레드로 분배해 준다"라고 하였는데, GCD에서의 해당 큐가 Dispatch Queue이다. Dispatch Queue DispatchQueue는 아래와 같이 사용이 가능한데, "큐의 종류", "qos 옵션", "동기/비동기" 에 대한 설정이 가능한데, 이들에 대해 순차적으로 알아보자! Queue의 종류 Dispatch Queue의 종류에는 3가지가 있다. main Queue global Queue custom Q..