스레드 안전을 위해 Objective-C 클래스를 작성했습니다. 이렇게하려면 pthread와 pthread_rwlock
을 사용하고 있습니다 (@synchronized
을 사용하면 잔인하며 pthread에 대해 더 자세히 배우고 싶습니다). 자물쇠는 init
메서드로 지정된 객체에 삽입되고 dealloc
으로 파괴됩니다. 자물쇠를 조작하는 세 가지 방법이 있습니다. readLock
, writeLock
, unlock
. 이 세 가지 메소드는 단순히 관련 pthread 함수를 호출하고 현재는 다른 것을 호출하지 않습니다. setAddValue:
먼저 기입 로크를 획득하고 또한 기록 잠금을 획득하려고 시도 setValue:atIndex:
를 호출 호출스레드에 잠금이 있는지 어떻게 결정합니까?
-(void)addValue:(const void *)buffer
{
[self writeLock];
NSUInteger lastIndex = self.lastIndex;
[self setValue:buffer atIndex:(lastIndex == NSNotFound) ? 0 : lastIndex+1];
[self unlock];
}
-(void)setValue:(const void *)buffer atIndex:(NSUInteger)index
{
[self writeLock];
//do work here
[self unlock];
}
:
여기 writeLock를 필요할 둘 오브젝트 방법, 두 가지이다. 설명서에는이 문제가 발생할 때 동작이 정의되지 않았 음이 나와 있습니다. 따라서, 잠금을 얻으려고 시도하기 전에 스레드에 잠금이 있는지 확인하려면 어떻게해야합니까?
(중요한 섹션이 다른 잠금 요청을 트리거하는 호출을하지 않도록 할 수는 있지만 코드 반복을 의미하므로 코드를 DRY 상태로 유지하고 싶습니다.)
이 정보는 약간 정확합니다. 'EDEADLK' 에러는'pthread_rwlock_ (rd | wr) lock'에 대해서만 지정되며,이 경우에는'EBUSY'를 리턴하고 호출 스레드 나 다른 스레드에 의해 잠금이 유지되는지를 구분하지 않는 trylock 함수가 아닙니다. 또한 같은 스레드가 보유하고있는 잠금은 쓰기 잠금 일 때만 감지 할 수 있습니다. 무제한의 독자가있을 수 있으므로 잠금을 보유한 독자의 신원을 확인할 수 없습니다. 그러나 OP의 경우에는 이중 쓰기 잠금처럼 보이는 것이 피할 필요가 있으므로 문제는 아닙니다. –
또한 'EDEADLK' 오류는'할 수 있습니다. '가 아니라'할 수 있습니다. '즉 구현을 감지하고보고 할 필요가 없습니다. –
추가 고려 사항에서 나는 당신의 솔루션이 작동한다고 생각하지 않습니다. 답변으로 대안을 게시했습니다. –