Swift: понимание тупика NSLock
Видя это сообщение в наших журналах, используя NSLock
:
*** -[NSLock lock]: deadlock (<NSLock: 0x6100000cbec0> '(null)')
*** Break on _NSLockError() to debug.
Означает ли это, что приложение обнаружило фатальную ошибку и перестанет работать? Или это обрабатывается каким-то "изящным" способом?
2 ответа
По определению, тупик означает, что рассматриваемый поток не может продолжаться. Свифт не "справляется" с тупиком, а просто сообщает вам, что это произошло.
То, как этот тупик проявляется в вашем приложении, зависит от того, что делал код, связанный с этим потоком. Но, очевидно, что бы это ни было, оно никогда не завершится и ресурсы для этого потока никогда не будут восстановлены. И если этот тупик произошел в главном потоке, приложение зависнет.
Суть в том, что цель этого сообщения не в том, чтобы сообщить вам, что тупик был обработан, а, наоборот, в том, чтобы сказать, что он не может быть обработан, и, следовательно, что вы обязаны исправить код, чтобы устранить эту проблему.
Свифт не имеет ничего общего с поведением здесь. Это не крах. Обратите внимание, что блокировки не являются повторно входящими, поэтому вызов lock
в то время как у вас уже есть блокировка вызовет тупик. Приложение будет зависать, если основной поток заблокирован, или один или несколько потоков будут заблокированы в фоновом режиме, вызывая неопределенное поведение, такое как данные не поступают, задачи не обрабатываются и т. Д.