티스토리 뷰
728x90
반응형
- atomic 이 안전하지만 그만큼 성능 저하가 발생한다. 그래서 꼭 필요한 경우가 아니라면 non-atomic 으로 설정해두는 것이 좋다. Swift 에서는 별도의 atomic 을 지정할 수 없고, GCD 로 구현할 수 있다.
1️⃣ 하나의 serial queue 가 테스크를 담당하도록 함
- concurrent queue 를 사용하거나 여러 개의 serial queue 를 사용하면 여러 스레드가 동시에 접근하는 경우 발생. 이를 막기 위해 근본적으로 하나의 serial queue 가 테스크를 담당.
- 이는 동시성을 포기하게 됨.
2️⃣ Dispatch Barrier
- Dispatch Barrier 사용하여 쓰기 작업은 thread-safe 하게, 읽기 작업은 동시에 작업할 수 있도록 만들 수 있다.(읽기 작업은)
- custom concurrent queue 에서만 사용할 수 있고, 이 queue 의 특정 task 를 수행할 때 다른 스레드가 일을 하지 않도록 막는 방법이다. 막는 스레드는 custom concurrent queue 가 담당하는 스레드들이다.
- 다른 스레드의 기존작업이 마무리되는 것을 기다리고 -> barrier task 수행 -> 완료되면 다른 스레드의 작업 실행
DispatchQueue(label: "barrierTestQueue", attributes: .concurrent).async(flags: .barrier) { }
3️⃣ Dispatch Semaphore
Semaphore 의 value 를 1로 설정하게 되면 barrier 처럼 사용할 수 있다.
- Semaphore 는 공유 자원에 동시 접근 가능한 작업 수를 제한할 때 사용됩니다.(Semaphore 객체 생성 시점에 value 값을 접근 가능한 작업 수만큼으로 초기화한다.)
// 💫 value 를 1로 설정하여 한번에 하나의 작업만 접근할 수 있도록 구현할 수 있다.
let semaphore = DispatchSemaphore(value: 1)
// 💫 value 가 0이면 기다리고, 0이 아니면 차감하고 다음 코드를 진행.
semaphore.wait()
DispatchQueue.global().async {
print("task")
// 💫 value 를 증감하고 다음 코드를 진행.
semphore.signal()
}
728x90
반응형
'iOS' 카테고리의 다른 글
iOS) Configurable Widget 만들기 (0) | 2022.12.04 |
---|---|
ARC(Automatic Reference Counting)란? (0) | 2022.11.18 |
iOS) thread-safe 와 atomic (0) | 2022.10.15 |
iOS) 앱 자동 배포를 위한 Fastlane 설정 - cert and sigh (9) | 2022.10.10 |
iOS) 프로젝트 배포 환경별 Build Scheme 세팅(.xcconfig 사용) + key 숨기기 (4) | 2022.10.04 |
댓글
TAG
- CloneCoding
- APNS
- Notification
- IOS
- YPImagePicker
- rxswift
- async/await
- github
- MOYA
- 서버통신
- configurable widget
- Protocol
- Swift
- UserDefaults
- containerBackground
- RxCocoa
- Algorithm
- 2022 KAKAO TECH INTERNSHIP
- OpenSourceLibrary
- Firebase
- WWDC
- SwiftUI
- Objective-C
- watchOS
- WWDC22
- projectsetting
- Widget
- MVVM
- WidgetKit
- urlsession
최근에 올라온 글
최근에 달린 댓글
글 보관함
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
링크
- Total
- Today
- Yesterday