我的iOS应用程序在主线程上的UIImage drawInRect
和后台线程上的UIApplication beginBackgroundTaskWithExpirationHandler
之间出现了死锁。在主线程上,堆栈如下所示:
0 semaphore_wait_drap
1 _dispatch_group_wait_slow
2 copyImageBlockSetJPEG
3 ImageProviderCopyImageBlockSetCallback
4 img_blocks_create
5 img_data_lock
6 CGSImageDataLock
7 ripc_AcquireImage
8 ripc_DrawImage
9 CGContextDrawImage
10 [UIImage drawInRect:blendMode:alpha:]
11 [UIImage scaleToSize:interpolationQuality:]
第11帧是缩放图像的类别方法。基本上,开始一个图像绘制上下文,将图像绘制到具有所需大小的0,0的上下文,并从上下文中获取图像。
后台线程上的堆栈如下所示:
0 semaphore_wait_trap
1 dispatch_semaphore_wait_slow
2 _addBackgroundTask
3 [UIApplication beginBackgroundTaskWithExpirationHandler:]
这两个相关的东西到底怎么能被同一个锁阻挡?
更新:当发生这种情况时,应用程序有很多线程条件和等待的信号量。在iOS上一次可以激活的活动锁和条件的数量是否有限制?