Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] Atomic 프로퍼티 만드는 방법 (#NSLock) 본문

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

Comments