2022. 5. 25. 10:37ㆍiOS 프레임워크
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 |