Должно ли использование NSLocking всегда заключаться в @ try / @ finally? - PullRequest
11 голосов
/ 12 октября 2011

Учитывая объект Какао NSLocking (например, NSLock) и некоторый нетривиальный код, который должен выполняться, пока блокировка удерживается:

Чтобы гарантировать, что блокировка всегда снята, следует следующая идиомавсегда использовать?

NSLock *mutex = // get lock from somewhere
@try {
    [mutex lock];
    // do non-trivial stuff
} 
@finally {
    [mutex unlock];
}

Это кажется разумным (и распространенным в Java), но я не видел ни одного кода Какао, делающего это.

Следует ли использовать эту идиому?Почему или почему нет?

Ответы [ 2 ]

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

Чтобы гарантировать, что блокировка всегда снята, должна ли всегда использоваться следующая идиома?

Да, где требуется корректность программы после этой области («нетривиальные вещи»),и при условии, что ваша программа может корректно восстановиться после исключений, с которыми она сталкивается.

Следует ли использовать эту идиому?Почему или почему нет?

Если вы можете восстановить, тогда да, разблокировка необходима для нормального продолжения выполнения.В противном случае ваша программа будет выполняться в недопустимом состоянии.

  • Пример 1: Когда блокировка уничтожена (во время dealloc), попытка уничтожить ее не удастся, потому что она все ещезаперта.Продолжает ли реализация уничтожать блокировку или игнорирует ошибку, не определено (я бы предположил , что она сохранится, то есть никогда не выйдет из dealloc).

  • Пример 2: Когда он заблокирован из другого потока (или того же потока, если не повторного входа), вы никогда не получите блокировку, и в результате может возникнуть другая ошибка, взаимоблокировка или исключение.Реализация также может (в конечном итоге) продолжаться без получения блокировки.Все, что гарантируется, - это запись в журнал, когда / если обнаружена ошибка.

pthread_mutex es и зависящие от них реализации могут вести себя не очень изящно, если у вас есть такой дисбаланс блокировки;это всегда приводит к ошибке программиста.

Правильная и защитная блокировка в чистом objc и c не очень красива.Идиома Java верна и в равной степени применима к API-интерфейсам Foundation.Причина, по которой вы не видите это , может быть в том, что исключения являются менее популярным / используемым механизмом обработки ошибок в API-интерфейсах Cocoa и программах, которые зависят от них (по сравнению с Java). см. Также Bavarious 'примечание в комментариях

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

номер

Исключения используются только для ошибок программирования в Какао. Они не используются в ситуациях, когда ожидается восстановление программы.

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