Swift: понимание тупика NSLock

Видя это сообщение в наших журналах, используя NSLock:

*** -[NSLock lock]: deadlock (<NSLock: 0x6100000cbec0> '(null)')
*** Break on _NSLockError() to debug.

Означает ли это, что приложение обнаружило фатальную ошибку и перестанет работать? Или это обрабатывается каким-то "изящным" способом?

2 ответа

Решение

По определению, тупик означает, что рассматриваемый поток не может продолжаться. Свифт не "справляется" с тупиком, а просто сообщает вам, что это произошло.

То, как этот тупик проявляется в вашем приложении, зависит от того, что делал код, связанный с этим потоком. Но, очевидно, что бы это ни было, оно никогда не завершится и ресурсы для этого потока никогда не будут восстановлены. И если этот тупик произошел в главном потоке, приложение зависнет.

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

Свифт не имеет ничего общего с поведением здесь. Это не крах. Обратите внимание, что блокировки не являются повторно входящими, поэтому вызов lock в то время как у вас уже есть блокировка вызовет тупик. Приложение будет зависать, если основной поток заблокирован, или один или несколько потоков будут заблокированы в фоновом режиме, вызывая неопределенное поведение, такое как данные не поступают, задачи не обрабатываются и т. Д.

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