Daily iOS
동시성

actor 재진입성

Swift Concurrency 로 만든 아래 이미지 캐시 actor는 같은 키에 대해 네트워크 요청이 두 번 나가는 경우가 있습니다. actor가 상태를 보호해 주는데도 왜 이런 일이 생기나요?

actor ImageCache {
    private var cache: [URL: UIImage] = [:]
    func image(for url: URL) async throws -> UIImage {
        if let hit = cache[url] { return hit }
        let img = try await download(url)
        cache[url] = img
        return img
    }
}
면접관은 이 답을 어떻게 들을까요? 넘어갈지, 더 물어볼지, 떨어뜨릴지 알려 주고, 걸리는 문장은 콕 집어 줘요. 점수는 그대로예요.
짧은 답 보기

actor는 await 지점에서 다른 호출을 받아들이는 재진입 모델이라, 첫 호출이 download를 기다리는 사이 두 번째 호출이 캐시 미스를 보고 또 요청한다. 데이터 레이스는 없지만 await를 사이에 둔 검사-후-쓰기가 논리적 레이스가 된다.

받은 질문 공유