나는 GCD 큐를 사용하여 자원에 대한 동시 액세스가 순차적으로 일어나는 것을 보장하기위한 몇 가지 메소드를 가진 objective-c 클래스를 가지고있다.GCD를 통해 objective-c에서 재진입 식 잠금 메커니즘을 구현하는 방법은 무엇입니까?
일부 메소드는 같은 클래스의 다른 메소드를 호출해야합니다. 따라서 잠금 장치는 재진입되어야합니다. 이것을하기위한 표준 방법이 있습니까?
은 처음에는 이러한 방법의 각 액세스를 동기화하는
dispatch_sync(my_queue, ^{
// Critical section
});
을 사용했다. 알다시피 이러한 메서드 중 하나가 다른 메서드를 호출하면 dispatch_sync 호출은 다른 블록이 실행될 때까지 현재 실행을 중지하기 때문에 교착 상태가 발생합니다. 큐에서 실행이 중지되기 때문에 실행도 불가능합니다. 이를 해결하기 위해 예를 들어 다음과 같이 사용했습니다. 이 방법은 :
- (void) executeOnQueueSync:(dispatch_queue_t)queue : (void (^)(void))theBlock {
if (dispatch_get_current_queue() == queue) {
theBlock();
} else {
dispatch_sync(queue, theBlock);
}
}
그리고 내 각각의 방법에
, 나는 다른 반환 형식과 모든 블록, 나는 다른 방법을 쓸 필요가 있기 때문에 나는이 솔루션을 좋아하지 않아[self executeOnQueueSync:my_queue : ^{
// Critical section
}];
를 사용합니다. 더욱이이 문제는 나에게 매우 일반적으로 보입니다.이 문제를 해결하기위한 더 나은 표준 솔루션이 있어야한다고 생각합니다.
'@ synchronized'를 대신 사용 하시겠습니까? –
@MartinR, 네,하지만'@ synchronized'는 GCD/대기열을 기반으로하지 않는 고전적인 잠금 장치입니다. 따라서 이해할 수 있도록 코드 단순성과 성능상의 이유로 사용하는 것이 좋습니다. 이 질문의 제목은 "잠금"을 포함하고 있기 때문에 오해의 소지가 있습니다. 내 뜻은 GDC/대기열과 재진입 방식으로 액세스를 동기화하는 것입니다. 나는 "재진입 잠금 (reentrant locking)"을 말하는 것보다 더 좋은 단어가 없었습니다. 왜냐하면 그것은 대부분의 사람들이 알고있는 문제에 대한 해결책의 이름이기 때문입니다. –
@MartinR, 또한'@ synchronized'는 재진입을위한 더 간단한 코드로 이끄는 이점을 가지고 있습니다 - 무엇이든 - (이 최선을 어떻게 부르는가?). 여전히 그 뒤에있는 잠금 메커니즘은 GCD 대기열 뒤에있는 메커니즘보다 성능이 떨어집니다. –