비동기로 동일 함수 실행

비동기로 같은 함수를 실행하게 되면 동시에 실행해서 같은 결과 값을 내게 됩니다.

import Foundation

var money = 10000

DispatchQueue.global().async {
    buy()
}

DispatchQueue.global().async {
    buy()
}

func buy() {
    money = money - 1000
    print(money)
}

9000

9000

 

 

sleep으로 동시 호출 방지

하나의 스레드가 실행될때 잠시 멈추게 하여 실행 간격에 차이를 둘 수도 있습니다.

var money = 10000

DispatchQueue.global().async {
    buy()
}

DispatchQueue.global().async {
    sleep(1)
    buy()
}

func buy() {
    money = money - 1000
    print(money)
}

9000

8000

 

 

lock으로 동시 호출 방지

만약 실행 간격에 차이를 두는것이 아니라 '하나의 스레드가 함수를 사용 중일때, 다른 스레드에서 접근을 못하게 하려면?'

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)
}

9000

8000

 

이렇듯 NSLock()으로 lock을 걸면 시간 간격 차이를 두는 것과 같은 출력값이 나오게 됩니다.

순서는 이렇습니다.

Thread 1 buy() 실행, lock() -> 다른 스레드에서 접근 못함 -> Thread 2 buy() 대기 -> Thread 1 buy() 실행 후 unlock() -> 다른 스레드에서 접근 가능 -> Thread 2 buy() 실행, lock() -> 다른 스레드에서 접근 못함 -> Thread 2 buy() 실행 후 unlock()

 

 

다른 스레드 사용 방지

unlock으로 잠금해제를 하지 않게 된다면? 다른 스레드에서 접근을 하지 못한채로 끝나게 되겠죠.

var money = 10000
let lock = NSLock()

DispatchQueue.global().async {
    buy()
}

DispatchQueue.global().async {
    buy()
}

func buy() {
    lock.lock()
    money = money - 1000
    print(money)
}

9000

'iOS > Swift' 카테고리의 다른 글

DispatchQueue의 의존성  (0) 2021.09.05
DispatchQueue 특징  (0) 2021.09.05
12.2.2. 영화관 정보 API  (0) 2021.09.02
12.3. 영화관 목록 화면 구현하기  (0) 2021.09.02
이미지 비동기 처리하기  (0) 2021.08.14

+ Recent posts