iOS 응용 (swift)
[iOS - swift] Atomic 프로퍼티 만드는 방법 (#NSLock)
jake-kim
2024. 2. 21. 01:45
Atomic 이란?
- 다중 스레드 프로그래밍에서 사용되는 개념
- 연산이 더 이상 분할되거나 중단될 수 없음을 의미
- thread safe 지키는 방법 중 하나 (구체적인 개념은 이전 포스팅 글 참고)
ex) 두 명의 사용자가 프린터 출력 명령 -> 각 인쇄는 중단되지 않고 한번에 실행
- 만약 atomic이 아닌 경우, 두 사용자의 자료를 부분적으로 인쇄되는 문제
Atomic 프로퍼티 생성 방법
- NSLock을 사용 (자세한 개념은 이전 포스팅 글 참고)
- lock() 메소드를 사용하면 그 하위 코드들은 스레드가 하나만 접근할 수 있는 영역
주의) 가끔 아래처럼 NSLock을 상속받게끔 구현할 수 있지만, MyInt를 사용하는 쪽에서는 알아서 불필요한 NSLock의 프로퍼티들까지 인터페이스가 열리기 때문에 비추천
final class MyInt: NSLock {
private var value: Int
public init(_ value: Int) {
self.value = value
}
}
extension MyInt {
func add(_ other: MyInt, _ value: Int) -> Int {
other.lock()
let oldValue = other.value
other.value += value
other.unlock()
return oldValue
}
}
- 별도의 instance로 NSLock을 만들고 연산자의 시작 부분에 lock()을 사용하고 끝 부분에 unlock()을 호출되게하여 NSLock을 사용하는 것으로 wrapping한 형태
final class MyInt {
private var value: Int
private let lock = NSLock()
public init(_ value: Int) {
self.value = value
}
}
extension MyInt {
func add(_ valueToAdd: Int) -> Int {
lock.lock()
defer { lock.unlock() }
return value + valueToAdd
}
}
* 참고
- https://ko.wikipedia.org/wiki/%EC%9B%90%EC%9E%90%EC%A0%81_%ED%96%89%EC%9C%84