Swift: 了解 NSLock 死锁
Swift: Understanding NSLock deadlock
使用 NSLock
在我们的日志中看到此消息:
*** -[NSLock lock]: deadlock (<NSLock: 0x6100000cbec0> '(null)')
*** Break on _NSLockError() to debug.
这是否意味着应用程序遇到致命错误并将停止工作?还是以某种 'graceful' 方式处理?
Swift 与此处的行为无关。这不是崩溃。请注意,锁不是可重入锁,因此在您已经拥有锁的情况下调用 lock
将导致死锁。如果主线程死锁,应用会出现卡死,或者一个或多个线程在后台死锁,导致未定义的行为,例如数据未到达,任务未处理等
根据定义,死锁意味着相关线程无法继续。 Swift 不会 "handle" 死锁,而只是通知您发生了这种情况。
此死锁如何在您的应用程序中表现出来取决于与该线程关联的代码在做什么。但是,显然,无论它是什么,它都永远不会完成,并且永远不会恢复该线程的资源。如果这个死锁发生在主线程上,应用程序将冻结。
最重要的是,此消息的目的不是告诉您死锁已得到处理,而是相反,告诉您它无法处理,因此,您有责任这样做修复代码以消除此问题。
使用 NSLock
在我们的日志中看到此消息:
*** -[NSLock lock]: deadlock (<NSLock: 0x6100000cbec0> '(null)')
*** Break on _NSLockError() to debug.
这是否意味着应用程序遇到致命错误并将停止工作?还是以某种 'graceful' 方式处理?
Swift 与此处的行为无关。这不是崩溃。请注意,锁不是可重入锁,因此在您已经拥有锁的情况下调用 lock
将导致死锁。如果主线程死锁,应用会出现卡死,或者一个或多个线程在后台死锁,导致未定义的行为,例如数据未到达,任务未处理等
根据定义,死锁意味着相关线程无法继续。 Swift 不会 "handle" 死锁,而只是通知您发生了这种情况。
此死锁如何在您的应用程序中表现出来取决于与该线程关联的代码在做什么。但是,显然,无论它是什么,它都永远不会完成,并且永远不会恢复该线程的资源。如果这个死锁发生在主线程上,应用程序将冻结。
最重要的是,此消息的目的不是告诉您死锁已得到处理,而是相反,告诉您它无法处理,因此,您有责任这样做修复代码以消除此问题。