<aside> 💡 Lock으로 올바르게 구현하는 것은 어렵기도하고, DeadLock이 생길 가능성이 높다. Lock을 사용해서 구현하는 것은 Low-Level의 해결책이다.
</aside>
잠재적 경쟁 상황 찾는 법
Xcode 툴 중에서 Thread Sanitizer tool
을 사용한다.
앱스토어 출시전 반드시 확인해야하는 일 중 하나이다.
실제 사용 예시
Thread-safe한 코드를 작성하기 위해서는 sync메소드를 사용해야한다.
위와 같은 그림은 Thread-safe하지 않다. 코드에서 단순히 다음과 같이 구현되어 있다고 볼 수 있다.
private let serialQueue = DispatchQueue(label: "...")
private var _count = 0
public var count: Int {
get {
return _count
}
set {
_count = newValue
}
}
sync를 사용해주게 되면 아래의 그림처럼 공통 접근 변수에 대해 안전하게 접근이 가능하다.
private let serialQueue = DispatchQueue(label: "...")
private var _count = 0
public var count: Int {
get {
return serialQueue.sync {
_count
}
}
set {
serialQueue.sync {
_count = newValue
}
}
}