Гарантированы ли блоки @synchronized, чтобы освободить их блокировки? - PullRequest
5 голосов
/ 12 октября 2011

Предположим, что это методы экземпляра и вызывается -run.

Блокировка на self снята к моменту возврата -run?

...
- (void)dangerous {
    @synchronized (self) {
        [NSException raise:@"foo" format:@"bar"];
    }
}

- (void)run {
    @try { [self dangerous]; }
    @catch (NSException *ignored) {}
}
...

Ответы [ 3 ]

10 голосов
/ 12 октября 2011
Блок

A @synchronized(obj) { code } фактически эквивалентен

NSRecursiveLock *lock = objc_fetchLockForObject(obj);
[lock lock];
@try {
    code
}
@finally {
    [lock unlock];
}

хотя любой конкретный аспект этого на самом деле просто детали реализации. Но да, блок @synchronized гарантированно снимает блокировку независимо от того, как управление выходит из блока.

4 голосов
/ 12 октября 2011

Да, блокировка снимается, когда возвращается -dangerous (даже через исключение). @synchronized добавляет неявный обработчик исключений для освобождения мьютекса.

4 голосов
/ 12 октября 2011

Да, это так.

Блокировка self будет снята после того, как ваш процесс выйдет из блока @synchronized (self) {}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...