Есть ли способ проверить, был ли приобретен NSLock? - PullRequest
3 голосов
/ 24 августа 2010

Я работаю над многопоточным кодом. Доступ к данным заблокирован в нескольких разделах через объекты «NSLock». Я хочу убедиться, что некоторые методы, вызываемые в этих разделах, проверяют, была ли установлена ​​соответствующая блокировка.

Что-то вроде:

assert([myLock isSet] == YES);

Я не могу найти что-то вроде "isSet" в NSLock. Есть идеи, как установить блокировку?

Спасибо!

Ответы [ 2 ]

9 голосов
/ 24 августа 2010

Как вы получаете блокировку? Если вы звоните lock, то тот факт, что вы даже работаете после этого, должен гарантировать, что вы его получили. Если вы позвоните lockBeforeDate, возвращаемое значение сообщит вам.

Если вы хотите проверить из другого места, вы можете сделать

if ( [myLock tryLock] )
{
    // oops, lock was not previously acquired!
    ...
    [myLock unlock];
}
else
{
    // yep, lock was already acquired
}

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

6 голосов
/ 24 августа 2010

номер

Потому что, как вы видите, любой результат, который вы получаете, бесполезен, потому что он может ( будет ) быть неправильным к тому времени, когда вы действительно его используете. Пример:

  1. Вы обнаружите, что замок заблокирован.
  2. Нить, удерживающая замок, разблокирует его.
  3. Вы сообщаете, что блокировка заблокирована.

Сбой и в другом направлении:

  1. Вы обнаружите, что замок не заблокирован.
  2. Другой поток блокирует блокировку.
  3. Вы сообщаете, что замок разблокирован.

Именно такие проблемы и объясняют, почему отладка тупиков и условий гонки так чертовски непроста.

Я думаю, вам следует задать еще один вопрос о вашей настоящей проблеме.

...