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
,