해결된 질문
작성
·
27
0
안녕하세요!
18강 전체적으로 cache 에 값을 세팅하기 전후로 lock 이나 semaphore 등을 이용해서 GCD 에서 thread safe 를 구현하는 방법에 대한 예시를 들어준것 확인했습니다
이때 removeAll()
의 앞뒤로는 따로 처리가 되어있지않아서, 정말 필요가 없어서 작성되어있지 않은건지, 아니면 단순 예시라서 여기까지는 적용하지 않은건지 궁금합니다
func clearAll() {
cache.removeAll()
}
두번째로, 이건 주제와 좀 동떨어진 질문이긴한데요..! (혹시 강의 성격과 너무 벗어났다 싶으면 무시해주세요!)
예시를 NSCache
로 들어주셨는데, NSCache 문서에 보면 캐시를 직접 잠그지 않고도 다양한 스레드에서 캐시에 항목을 추가, 제거 및 쿼리할 수 있다고 나와있는걸 확인했습니다.
You can add, remove, and query items in the cache from different threads without having to lock the cache yourself
즉, 문서를 통해 자체적으로 thread safe 하게 뭔가를 하고 있구나..를 유추할 수 있기 때문에 (내부적으로는 NSLock 을 사용하고 있긴하지만요) 이럴때는 저희쪽에서 @unchecked Sendable
만 사용해도 무방할까요?
하지만 이런 문서 등을 확인하지 않는 이상 정확히 NSCache 가 thread safe 하게 뭔가를 처리한다는걸 확인할 수 없기 때문에, 예시처럼 @uncheked Sendable
명시와 동시에 자체적으로 semaphore 나 lock 을 걸어줘야하는건지..?
앨런님은 어떻게 생각하시는지 궁금합니다!
감사합니다~
답변 2
1
네, 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
안녕하세요, 인프런 AI 인턴입니다. sujinnaljin님께서 GCD에서의 Thread-safety와 NSCache 사용에 관해 두 가지 질문을 해주셨군요. 질문에 대한 답변을 아래에 드리겠습니다.
removeAll()
메소드의 처리removeAll()
메소드의 경우, NSCache 자체가 Thread-safe하게 설계되어 있어 추가적인 동기화 처리가 필요하지 않습니다. 즉, NSCache를 이용하는 경우, 데이터의 수정이나 삭제 작업 후에 별도로 락을 걸지 않더라도 안전하게 사용할 수 있습니다. 따라서, 강의에서는 이 부분을 생략한 것이니 크게 우려하지 않으셔도 됩니다.
관련된 Concurrency - Image Cache 부분 질문 링크를 참조하여 더 많은 정보를 확인하실 수 있습니다.
NSCache는 Apple의 공식 문서에서도 설명한 것처럼 기본적으로 Thread-safe하게 설계되어 있습니다. 그래서 직접적으로 캐시를 락으로 보호하지 않아도 됩니다. 대신 사용 중인 코드는 성능이나 특정 상황에서의 에러 처리를 위해 필요에 따라 동기화 메커니즘을 추가할 수 있습니다. 하지만 일반적인 경우에는 NSCache가 제공하는 기본적인 Thread-safety를 믿고 그대로 사용해도 충분합니다.
@unchecked Sendable
을 사용하여 NSCache를 스위프트의 Concurrency와 함께 사용할 수 있지만, 이 경우 개발자가 수동으로 Thread-safe한 설계를 보장해야 합니다. NSCache 자체에 대한 강한 신뢰가 있다면 @unchecked Sendable
을 사용해도 괜찮으나, 더 복잡한 동작을 추가하는 경우라면 실제 필요에 따라 보호 메커니즘을 구현할 수 있습니다.
여기에 대한 자세한 설명은 GCD - 7.(심화) Thread-safe한 코드의 구현과 방법 질문 링크를 통해 확인할 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
감사합니다~!