0

Objective-C에서 여러 스레드가 액세스 할 수있는 단일 클래스를 설계하고 있습니다. 내 수업에는 3-30 NSMutableArray s가 있으며, 수업 외부에는 이라는 액세스 권한이 있습니다. 작업을 읽고 추가하고 제거하는 것은 당연히이 클래스에서 래핑됩니다.변경 가능한 배열 액세스에서 @synchronized 지시문을 널리 사용하는 것에 대한 대안

NSMutableArray은 스레드로부터 안전하지 않으므로 @synchronized()을 사용하여 작업을 안전하게 처리 할 수 ​​있지만 @synchronized() 블록이 너무 많이 사용됩니다.

각 3 ~ 4 개의 배열에 대해 적어도 하나의 함수가 추가되었으므로 1 개의 함수가 제거되고 5 번은 값을 읽어야합니다. 그래서, 1 배열에 대해 적어도 7 @synchronized() 블록을 사용하고 있습니다. 4 배열의 경우 내 싱글 톤 클래스에 28 @synchronized 블록을 추가해야합니다.

내 문제에 접근하는 더 좋은 방법이 있습니까? 또는이 @synchronized 지시문을 모두 사용하면 문제가 발생합니까?

나는 내 객체를 스레드로부터 안전하게 만들고 싶다면 코드를 느리게 만들지 만 그 외에는 단점이 있다는 것을 알고있다.

+1

1) 싱글 톤이 스레드로부터 안전하다면, 아마도 _NSMutableArray_의 데이터 멤버에 대해 걱정할 필요가 없을 것입니다. 2) 데이터 멤버의 _atomic/nonatomic_ 속성을 들어보고 사용 했어야합니다. 전자는 스레드를 안전하게합니다. 추가 보안을 위해 _NSMutableArrays_를 원자 적으로 선언 할 수 있습니다. – Adeel

+1

또 다른 방법은 각 배열에 대해 직렬 디스패치 대기열을 만드는 것입니다. 그런 다음 배열 업데이트 방법의 관련 대기열에 동 기적으로 배열 업데이트를 전달할 수 있습니다. @Adeel, NSMutable 배열 속성을 원자 적으로 만들면 기본 배열 threadsafe가 아니라 속성 자체 만 만들 수 있습니다. – Paulw11

+1

@Adeel : 변경할 수있는 객체 유형의 속성에 atomic 속성을 사용하면 돌연변이를 동기화하는 데 전혀 아무런 영향을 미치지 않습니다. 그것은 "스레드 안전"하지 않습니다. 한 가지만하고 한 가지만 수행합니다. getter와 setter가 중단되지 않도록합니다. 그 후에 제어되지 않는 개체는 어떻게됩니까? –

답변

2

일반적으로 스레드 안전성을 확보하기 위해 기본 호출 (CRUD)을 동기화하는 데 충분한 이 아닌입니다. 이 세분화 된 수준은 기본적인 것일 뿐이지 만 더 많은 글로벌 수준을 생각하고 많은 양의 코드를 "원자화"해야합니다. 이렇게하는 방법은 실제 구현에 크게 의존합니다. 멀티 스레딩은 악의적 인 일이며 포괄적 인 관점을 요구하므로 이에 대한 일반적인 대답은 없습니다.

동기화 된 블록은 일반적으로 너무 자주 호출되는 경우 응용 프로그램 속도를 저하시킵니다. 때때로 잠금 오버 헤드를 피하기 위해 하나의 동기화 된 블록에서 여러 호출을 그룹화하는 것이 좋습니다. 또는 불필요한 작업 중지를 방지하기 위해 전화가 매우 짧은 경우 스핀 잠금을 사용할 수 있습니다 (here for an old question/answer 참조).

자세한 내용은 Apple documentation을 참조하십시오.

+0

나는 객관적인 C에서 새롭다, 나는 리눅스에서 일했다, 자물쇠 및 객관적인 c 뮤텍스는 pthread_mutex_lock와 유사하다? ** synchronized ** 및 ** pthread_mutex_lock은 동일한 스레드 또는 함수 스택 내에서 pthread_mutex_lock이 잠길 수있는 코드를 잠그지 않기 때문에 사용이 가능합니다. ** 동기화 **의 또 다른 이점은 ** 블록 내에서 원할 때마다 ** return **을 사용할 수 있으며 자동으로 잠금이 해제됩니다. 하지만 pthread_mutex_lock을 사용하면 조건을 빠뜨리는 경우 인생의 지옥이됩니다. –

+1

나는 세부 사항이 이미 여기에 있다고 생각합니다 : http://stackoverflow.com/questions/9463525/pthread-mutex-t-vs-synchronized-block- 스핀 락은 매우 다르다. 매우 짧은 호출시에 권장됩니다. –

+0

답변 해 주셔서 감사합니다. 죄송합니다. 스핀 락이 나쁜 아이디어 인 iOS에 대해서는 언급하지 않았습니다. 내 생각에, 당신이 제안한 것처럼 재귀 mutex가 더 적절할 것이라고 생각합니다. –