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

时间:2012-11-20 12:42:11

标签: ios semaphore hang

我在异步(串行)工作队列中有一个长时间运行的函数。 我知道有时这个函数会在特定的openCV调用中挂起。 由于某种原因,这个挂起也导致主线程挂起。 暂停并进入调试模式时,我看到有一个对

的调用
semaphore_wait_trap()

在主线程(队列)

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

在取消暂停工作线程后,GUI响应1-2秒(我怀疑再次激活此线程)然后UI再次无响应。

此线程不对主线程/队列

进行dispatch_sync()调用

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

我可以强制它删除块??

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

在暂停挂起队列之前:

Main Queue Stack

挂线:

Hanging Queue

暂停和暂停坏队列后:

After Suspending

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

也许你只是忘了将一个变量保留到dispatch函数调用中(对于我来说,我在dispatch_once_t声明之前省略了一个静态关键字,并且dispatch无法使用内联函数进行处理)。堆栈跟踪就像你的一样。那是我的错。

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