主线程上的IOS semaphore_wait_trap导致在UI中挂起

我有一个很长的运行在一个asynchronous(串行)工作队列中的函数。 我知道有时候这个函数挂在一个特定的openCV调用中。 由于某种原因,这个挂起也导致主线程挂起。 当暂停和进入debugging模式时,我看到有一个呼叫

semaphore_wait_trap() 

在主线程(队列)上

我可以在debugging模式下挂起挂起的线程(我的工作队列),然后这个陷阱消失,GUI再次在手机上响应。

取消暂停工作线程后,GUI响应1-2秒(我怀疑直到这个线程再次被激活),然后UI再次变得无响应。

此线程不会对主线程/队列调用dispatch_sync()

IOS是否可能暂停主线程(“陷阱”),因为工作人员长时间运行?

我可以强迫它删除块吗?

我正在添加debugging模式堆栈的一些打印屏幕。

暂停悬挂队列之前:

主队列堆栈

和挂线:

挂队

暂停并暂停错误队列后:

暂停后

IOS是否可能暂停主线程(“陷阱”),因为工作人员长时间运行? – 没有。 我认为,你的问题与绘制或改变一些UI元素有关。 并不是所有的函数都可以从后台线程调用(例如,在主线程中必须改变UI元素)。 在串行队列中,如果有任何方法需要更改UI元素,则必须在主线程上调用它,例如

 dispatch_async(dispatch_get_main_queue(), ^{ //do some main thread job here }); ) 

也许你只是忘记保留一个variables调度函数调用(至于我在dispatch_once_t声明之前省略了一个静态关键字,调度不能用内联函数处理)。 堆栈跟踪就像你的一样。 那是我的错

 + (instancetype)sharedInstance { (static was omitted) dispatch_once_t once; static id sharedInstance; dispatch_once(&once, ^{ sharedInstance = [[self alloc] init]; }); return sharedInstance; }