2016-07-18 3 views
1

나는 맥과 리눅스, AIX와 솔라리스와 같은 몇몇 유닉스 플랫폼에서 작동하는 몇 가지 소프트웨어를 유지하고있다. pthread 또는 Win32 스레드 위에 스레딩 인프라를 구현합니다. 나는이 인프라에서 rwlocks를 구현하여 개발자들이 사용할 수 있도록하기 시작했습니다. 여태까지는 그런대로 잘됐다.Q : 맥 오에스텐 pthreads와 GCD, GCD에서 rwlock을 찾을 수있다.

Mac OS X에서 원래 pthread를 사용하여 스레딩을 구현했지만 OS X pthreads 뮤텍스가 항상 시스템 호출을했기 때문에 성능이 매우 좋지 않음을 발견했습니다. Apple은 GCD 디스패치 세마포어를 사용하도록 권장했으며 세마포를 기다리는 것은 세마포어가 무료 인 경우 간단한 사용자 공간 작업이기 때문에 상당한 성능 향상을 보였습니다.

그러나 rwlocks와 동일한 방법을 사용할 수 없으며 간단한 세마포로는 불가능 해 보입니다. 실종 되었습니까? 아니면 실제로 불가능합니까?

참고 : 모든 것을 대기열 및 블록을 사용하여 GCD 방식으로 전환하는 것은 실현 불가능합니다. 이 코드는 GCD가없는 플랫폼에서 작동해야하며, 170 개 소스 파일에서 스레딩 인프라의 모든 용도를 다시 작성하는 것이 실용적이지는 않습니다.

+0

GCD에서 읽기 - 쓰기 잠금을 구현하는 일반적인 방법은 [이 답변] (http://stackoverflow.com/a/10234838/1218876) (및 관련 링크)에 설명되어 있습니다. 그 방법을 사용할 수없는 이유가 있습니까? 왜 정확히 하나의 세마포를 사용할 필요가 있습니까? –

+0

나는 그것을 할 수있는 방법을 찾을 수 있다면 행복하게 여러 개의 세마포어를 사용할 수 있지만 내가 볼 수있는 한 멀리 애플의 블록 구조를 사용할 수 없기 때문에 나는 dispatch_barrier_async()를 사용할 수 없다. 나는 C로 컴파일되는 도메인 특정 언어로 작업하고 있으며, 애플의 블록에 대해서는 아무것도 모른다. 내가 사용하고있는 GCD의 * only * 부분은 세마포어입니다 : 다른 모든 것은 pthreads입니다. –

+0

반드시 블록을 사용할 필요는 없습니다. GCD는 모든 프리미티브의 함수 기반 버전을 가지고 있습니다. 예를 들어 [dispatch_barrier_async_f] (https://developer.apple.com/reference/dispatch/1452812-dispatch_barrier_async_f)가 있습니다. –

답변

0

어리석은 저, 위키 피 디아를 먼저 확인 했어야합니다. 거기에는 several ways이 있습니다. 그것은 표준 컴퓨터 과학 문제입니다 : 전혀 사소한 것은 아니지만 잘 이해 된 것입니다.