어느 언어든지 간에 Thread를 사용하는 프로그램을 개발할 때에는
Thread Safe하게 코드를 구성해야 할 때가 있습니다.
Swift에서도 마찬가지입니다.
Swift에는 간단히 사용할 수 있는 NSLock라는 클래스가 있습니다.
아주 간단한 예제를 통해서 사용 방법을 익혀 봅시다.
var money = 10000
DispatchQueue.global().async {
buy()
}
DispatchQueue.global().async {
buy()
}
func buy() {
money = money - 1000
print(money)
}
멀티 스레딩 예제로 아주 적합한 돈에 관련한 예제입니다.
코드를 보면 DispatchQueue.global().async를 통해서 2개의 Thread를 실행시킵니다.
그리고 buy()라는 메소드를 통해서 money라는 하나의 데이터를 변경합니다.
당연한 결과 이긴 하지만 둘다 9000이 된 결과를 볼 수 있을 겁니다.
두개의 Thread가 동시에 buy()라는 메소드를 실행시킨 탓일 겁니다.
그럼 NSLock을 사용하여 이를 원하는 결과가 나오게 해봅시다.
var money = 10000
let lock = NSLock()
DispatchQueue.global().async {
buy()
}
DispatchQueue.global().async {
buy()
}
func buy() {
lock.lock(); defer {lock.unlock()}
money = money - 1000
print(money)
}
NSLock이 buy()가 실행됬을때 lock.lock()로 잠구고,
defer은 buy()가 끝날때 실행이 되는데, 그 때 lock.unlock을 통해 잠금을 풉니다.
Thread 1 buy() 실행, 잠금 -> Thread 2 buy() 대기 -> Thread 1 buy() 실행 후 잠금 해제 -> Thread 2 buy() 실행, 잠금 -> Thread 2 buy() 실행 후 잠금해제
이런식으로 실행이 됩니다.
그러면 원하는 결과를 얻을 수 있습니다.
'Swift' 카테고리의 다른 글
Swift 프로토콜(protocol)과 Java 인터페이스(interface) 차이 (2) | 2017.02.16 |
---|---|
Swift dynamic (0) | 2017.02.15 |