NSLock

2022. 5. 25. 10:37iOS 프레임워크

0. 개발자 문서 확인

먼저 알아보기 전에 NSLock에 관한 설명을 애플의 개발자 문서에서 먼저 찾아보았다.

https://developer.apple.com/documentation/foundation/nslock

 

An object that coordinates the operation of multiple threads of execution within the same application.

“동일한 어플리케이션 내에서 여러 스레드를 조정하는 객체” 라고 나와 있었다.

 

1. Thread-Safe를 지키는 방법

  • Re-entrancy
    • 어떤 함수가 한 스레드에 의해 호출되어 실행 중일 때, 다른 스레드에서 함수가 호출되더라도 올바르게 주어져야함
  • Thread-local storage
    • 공유 자원을 줄여 각 스레드에서만 접근 가능한 저장소들을 사용해 동시 접근을 막음
  • Mutual exclusion
    • 공유 자원을 꼭 사용해야 할 경우 semophore등의 lock으로 통제하여 다른 스레드가 접근하지 못하게 함. 임계 영역 안에서 한가지 스레드만 접근
  • Atomic operations
    • 공유 자원에 접근할 때 원자 연산을 이용하거나 원자적으로 정의된 접근 방법을 사용함.
    • 접근 순서를 의도적 또는 비 의도적으로 직렬화하여 의도치 않는 결과를 피하는 연산 방식.NSLock 객체를 사용하여 애플리케이션의 글로벌 데이터에 대한 액세스를 중재하거나 중요한 코드 섹션을 보호하여 원자적으로 실행할 수 있습니다.

NSLock을 사용하면 Thread-Safe하게 만드는 방법 중 하나인 atomic하게 실행하는 조건을 충족시킬 수 있다.


주의

잠금을 한 같은 스레드에서 잠금을 해제해야함. 다른 스레드에서 잠금을 해제할 경우 원하는 결과가 나오지 않을 수 있음.

같은 메서드에서 잠금 메서드를 두번 호출할 경우 스레드가 영구적으로 잠기게 됨.

 

2. 예시 코드

calculate 메서드에 접근할 때 lock을 한후 calculate가 끝나기 직전 lock을 풀어주는 코드이다.

 

Thread 1에서 calcuate 메서드 실행과 잠금 → Thread 2에서 calcuate 메서드 실행 대기 → Thread 1에서 calculate 실행 후 잠금 해제 → Thread 2에서 calcuate 메서드 실행과 잠금 → Thread 2에서 calculate 실행 후 잠금 해제

 

이렇게 직렬화하여 순차적으로 계산하게 된다면 의도치 않은 결과가 나오는 것을 피할 수 있다.

'iOS 프레임워크' 카테고리의 다른 글

SwiftUI - 조심스러운 첫 걸음  (0) 2023.11.30
Core Animation Pipeline  (0) 2022.05.24
CADisplayLink  (2) 2022.05.23
UI작업이 Main Thread에서 이뤄져야 하는 이유  (0) 2022.05.20
CGRect, CGSize, CGPoint에 대하여  (0) 2022.04.28