inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

앨런 Swift Concurrency for Swift 6 (Part-2)

(참고) 간단한 형태의 캐시 구현 예시 (GCD기반) - 직렬큐 / 세마포어 / 락(Lock) (18강)

18강 NSCache 예시 질문

해결된 질문

99

sujinnaljin

작성한 질문수 8

0

안녕하세요!

18강 전체적으로 cache 에 값을 세팅하기 전후로 lock 이나 semaphore 등을 이용해서 GCD 에서 thread safe 를 구현하는 방법에 대한 예시를 들어준것 확인했습니다

이때 removeAll() 의 앞뒤로는 따로 처리가 되어있지않아서, 정말 필요가 없어서 작성되어있지 않은건지, 아니면 단순 예시라서 여기까지는 적용하지 않은건지 궁금합니다

func clearAll() {
   cache.removeAll()
}

 

두번째로, 이건 주제와 좀 동떨어진 질문이긴한데요..! (혹시 강의 성격과 너무 벗어났다 싶으면 무시해주세요!)

예시를 NSCache 로 들어주셨는데, NSCache 문서에 보면 캐시를 직접 잠그지 않고도 다양한 스레드에서 캐시에 항목을 추가, 제거 및 쿼리할 수 있다고 나와있는걸 확인했습니다.

즉, 문서를 통해 자체적으로 thread safe 하게 뭔가를 하고 있구나..를 유추할 수 있기 때문에 (내부적으로는 NSLock 을 사용하고 있긴하지만요) 이럴때는 저희쪽에서 @unchecked Sendable 만 사용해도 무방할까요?

하지만 이런 문서 등을 확인하지 않는 이상 정확히 NSCache 가 thread safe 하게 뭔가를 처리한다는걸 확인할 수 없기 때문에, 예시처럼 @uncheked Sendable 명시와 동시에 자체적으로 semaphore 나 lock 을 걸어줘야하는건지..?

앨런님은 어떻게 생각하시는지 궁금합니다!

감사합니다~

ios swift 동시성 async-await concurrency

답변 2

1

앨런(Allen)

네, sujinnaljin 님

첫번째 질문)
아, 네네 단순 예시라서 제가 꼼꼼하게 작성하지는 않았었네요! 말씀하신대로 정확하게 작성하신다면.. 아래와 같은 형태로 작성하시는 것이 당연히 맞습니다. (삭제도 딕셔너리에 접근하는 것이니까요.)

func clearAll() {
    lock.lock()
    cache.removeAll()
    lock.unlock()
}

 

두번째 질문)

아 네, NSCache 자체는 내부적으로 일단 Thread-safe하기 때문에 @unchecked Sendable 만 사용하셔도 됩니다. (아래와 같은 처리를 안해도 된다는 것이겠죠.)

func setValue(_ value: Value, for key: Key) {
     semaphore.wait()
     cache[key] = value
     semaphore.signal()
}
func setValue(_ value: Value, for key: Key) {
     lock.lock()
     cache[key] = value
     lock.unlock()
}

 

그리고.. 일단 공식문서에 Thread-safe하다고 나와있으니, (저라면) 아래처럼 그냥 직접적으로 사용할 것 같고..

func setValue(_ value: Value, for key: Key) {
     cache[key] = value
}


만약에 그 전에 (1) NSCache를 사용해본 적이 없거나, (2) 공식문서를 미리 확인하지 않았다는 가정을 해보면, 당연히 @unchecked Sendable + 안전하게 위(semaphore or lock)와 같은 처리를 사용할 것 같습니다.
(물론 예를 들어, 위와 같은 메서드 로직에서 NSCache만 사용하는 것이 아니라, 다른 딕셔너리 등도 속성으로 같이 처리해주는 등이 있다면, 아무리 NSCache를 사용한다더라도, semaphore 나 lock 을 사용해야겠지만요.)

답변이 되셨으면 좋겠습니다. :)

 

 

감사합니다...!

0

sujinnaljin

감사합니다~!

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. sujinnaljin님께서 GCD에서의 Thread-safety와 NSCache 사용에 관해 두 가지 질문을 해주셨군요. 질문에 대한 답변을 아래에 드리겠습니다.

1. removeAll() 메소드의 처리

removeAll() 메소드의 경우, NSCache 자체가 Thread-safe하게 설계되어 있어 추가적인 동기화 처리가 필요하지 않습니다. 즉, NSCache를 이용하는 경우, 데이터의 수정이나 삭제 작업 후에 별도로 락을 걸지 않더라도 안전하게 사용할 수 있습니다. 따라서, 강의에서는 이 부분을 생략한 것이니 크게 우려하지 않으셔도 됩니다.

관련된 Concurrency - Image Cache 부분 질문 링크를 참조하여 더 많은 정보를 확인하실 수 있습니다.

2. NSCache의 Thread-safety 관련

NSCache는 Apple의 공식 문서에서도 설명한 것처럼 기본적으로 Thread-safe하게 설계되어 있습니다. 그래서 직접적으로 캐시를 락으로 보호하지 않아도 됩니다. 대신 사용 중인 코드는 성능이나 특정 상황에서의 에러 처리를 위해 필요에 따라 동기화 메커니즘을 추가할 수 있습니다. 하지만 일반적인 경우에는 NSCache가 제공하는 기본적인 Thread-safety를 믿고 그대로 사용해도 충분합니다.

@unchecked Sendable을 사용하여 NSCache를 스위프트의 Concurrency와 함께 사용할 수 있지만, 이 경우 개발자가 수동으로 Thread-safe한 설계를 보장해야 합니다. NSCache 자체에 대한 강한 신뢰가 있다면 @unchecked Sendable을 사용해도 괜찮으나, 더 복잡한 동작을 추가하는 경우라면 실제 필요에 따라 보호 메커니즘을 구현할 수 있습니다.

여기에 대한 자세한 설명은 GCD - 7.(심화) Thread-safe한 코드의 구현과 방법 질문 링크를 통해 확인할 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

수강 기간 연장 문의

0

28

1

수강연장부탁드려도될까요..

0

42

2

Combine Playground 에서 실행 시

0

57

2

레디선 테스트코드에서 채널이름은 없어도 되는건가요?

0

39

2

70강 - 글로벌 액터로 격리된 Protocol 을 extension 에서 conform 시 타입 본체의 격리 수준 질문

0

41

1

searchable이 화면 하단에 위치해요

0

61

2

모니터와 synchronized, ReentrantLock, 원자적연산 CAS관련해서 추가적으로 더 깊게 공부했는데 제가 이해한 것이 맞나요??

0

85

1

mac python 3.10 - permission denied

0

54

1

Future cancel기능을 사용했지만 interrupt가 발생하지 않을 때 어떻게 처리해야하나요?

0

73

2

Drawing Cycle 관련 질문

0

72

1

2.스레드 생성과 실행 - 17P 그림 문의

0

74

2

자바 동시성 현업에서 사용예시가 궁금합니다

0

136

1

20강 Task 내부에서 nonisolated async 호출 예제 질문드립니다

0

78

2

19강 Actor 의 동작 관련해 질문드립니다

0

83

2

Actor에서 Task vs Task.detached 사용 시 재진입 문제 질문

0

104

2

Task 클로저 내 `non-Sendable` 값 타입 접근 시, 캡처 리스트가 정의된 Task 순서에 따른 컴파일러 에러 차이

0

118

1

3강 스레드 제어권 관리 질문드립니다

0

72

1

10번 강의 관련하여 질문드립니다.

0

71

2

ImageProject 관련 문의

0

59

1

10강 내용 문의드립니다.

0

84

2

강의를 들으면서 생긴 질문이 있습니다.

0

136

3

협력적 쓰레드 풀에서 쓰레드 운영방식 질문 드립니다.

0

81

1

안녕하세요. 액터 홉핑 관련 질문드립니다.

0

157

1

재개될 때 스레드 변경시 왜 컨텍스트 스위칭이 발생하지 않는 건가요?

0

315

2