NSLock - должен просто блокироваться при блокировке заблокированной блокировки?

У меня есть цикл, который начинается с

[lock lock];

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

Однако во втором цикле я получаю следующую ошибку:

2011-02-02 07:15:05.032 BLA[21915:a0f] *** -[NSLock lock]: deadlock (<NSLock: 0x100401f30> '(null)')
2011-02-02 07:15:05.032 BLA[21915:a0f] *** Break on _NSLockError() to debug.

Документация "lock" гласит следующее:

Аннотация: Пытается получить блокировку, блокируя выполнение потока, пока блокировка не будет получена. (требуется)

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

2 ответа

Решение

Похоже, две проблемы:

  • Блокировка блокировки в одном потоке и разблокировка в другом не поддерживается - вы, вероятно, хотите NSCondition, Подожди NSCondition в родительском потоке и сигнализировать об этом в дочернем потоке.
  • Нормальный NSLock не может быть заблокирован, пока уже заблокирован. Это то что NSRecursiveLock для.

Вы не забыли отправить -unlock когда вы закончили? Каждый звонок -lock должны быть в паре с вызовом -unlock,

Другие вопросы по тегам