NSLock - должен просто блокироваться при блокировке заблокированной блокировки? - PullRequest
8 голосов
/ 02 февраля 2011

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

[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.

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

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

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

Ответы [ 2 ]

9 голосов
/ 02 февраля 2011

Звучит как две проблемы:

  • Блокировка блокировки в одном потоке и разблокировка в другом не поддерживается - вы, вероятно, хотите NSCondition. Подождите NSCondition в родительском потоке и сообщите об этом в дочернем потоке.
  • Обычный NSLock не может быть заблокирован, пока он уже заблокирован. Вот для чего NSRecursiveLock.
3 голосов
/ 02 февраля 2011

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

...