10

내 응용 프로그램은 GCD를 많이 사용하며, 거의 모든 것이 디스패치로 처리되는 작은 작업으로 분할됩니다. 그러나 기본 데이터 모델은 대부분 읽혀지며 가끔씩 작성됩니다.GCD로 읽기 - 쓰기 잠금

현재 읽고있는 동안 중요한 데이터 구조가 변경되지 않도록 잠금 기능을 사용하고 있습니다. 그러나 오늘 잠금 장치를 살펴본 후 NSConditionLock과 읽기 - 쓰기 잠금에 대한 일부 페이지를 발견했습니다. 후자는 내가 필요한 것입니다.

이 구현이 발견되었습니다 : http://cocoaheads.byu.edu/wiki/locks. 내 질문은,이 구현은 GCD와 함께 작동 할 것이고, PThreads를 사용한다는 것을 알 수 있을까요?

답변

20

여전히 작동합니다. pthreads는 Mac OS X의 다른 모든 스레드 사용 API의 기초가되는 스레딩 API입니다 (마하 스레드 활성화가 있지만 SPI는 API가 아닙니다.) 어쨌든 pthreads 잠금은 실제로 pthreads를 사용하지 않아도됩니다. 스레드.

이지만 GCD는 iOS 5 : dispatch_barrier_async()의 더 나은 대안을 제공합니다. 기본적으로 개인 동시 대기열이 있습니다. 정상적으로 모든 읽기 작업을 제출합니다. 장벽 루틴을 사용하여 쓰기 조작을 제출합니다. 따 - ​​다! 읽기 - 쓰기 잠금.

WWDC 2011 session video for Session 210 - Mastering Grand Central Dispatch에 액세스 할 수있는 방법에 대해 자세히 알아볼 수 있습니다.

+1

아, 장벽에 대해 읽었지 만 당시로서는 실용적인 응용 프로그램을 생각할 수 없었습니다. (나는 그 당시 멀티 스레드를 간신히 사용했습니다.) 모든 것을 잊었습니다. 고마워, 나는 내가 그것을 사용할 수 있는지보기 위해 노력할 것이다! –

+3

Mike Ash는 또한 GCD를 사용하여 리더 - 라이터 동기화를 수행하는 방법에 대한 좋은 예를 제공합니다. http://www.mikeash.com/pyblog/friday-qa-2011-10-14-whats-new-in-gcd.html –

1

또한 모든 읽기/쓰기 작업에 대해 직렬 대기열을 유지하는 것이 좋습니다. 그런 다음 dispatch_sync()을 해당 대기열에 기록하여 데이터 모델의 변경 사항이 즉시 적용되고 dispatch_async() 모든 읽기가 응용 프로그램에서 좋은 성능을 유지하는지 확인할 수 있습니다.

모든 읽기 및 쓰기가 이루어지는 단일 직렬 대기열이 있으므로 쓰기 도중 읽기가 발생하지 않도록하십시오. 이것은 잠금 장치에 비해 비용이 훨씬 적지 만 여러 개의 '읽기'작업을 동시에 실행할 수 없음을 의미합니다. 대부분의 응용 프로그램에서 문제가 발생하지는 않습니다.

을 사용하면 차단 블록이 실행되기 전에 대기열의 모든 기존 작업이 완료되어야하므로 실제로 커밋되기까지 일정 시간이 걸릴 수 있습니다.

+0

흠, 직렬 대기열에서 비동기 적 디스패치가 가능하다는 것을 깨닫지 못했습니다. 이것은 흥미로운 아이디어처럼 들리지만 ... 모든 읽기는 비교적 작은 편집이지만 보통 쓰기는 데이터를 읽고 편집하고 저장하는 것을 의미합니다. –

+5

일반적으로 여기에 제시된 것과 반대입니다. 일반적으로 호출자에게 반환하기 전에 결과가 필요하므로 읽기는 일반적으로 동기식으로 제출해야합니다. 호출자는 외부에서 볼 수있는 상태가 기록 된 날짜와 일치한다는 점만 알고 있기 때문에 비동기식으로 완료 할 수 있습니다. 이는 대기열이 직렬이기 때문에 쓰기가 완료 될 때까지 읽기를 진행할 수 없기 때문입니다. 언급 한대로 여러 독자에게 도움이되지 않습니다. –

관련 문제