记一次semaphore导致的界面假死

2017-12-13  本文已影响24人  亲爱的八路

iPad上会出现刚登录上账号,界面就假死,iPhone6s上就不会

此时查看线程,可以看到主线程是semaphore_wait_trap,如图所示


image.png

把其他线程点开来看调用堆栈,也是一样的,可以看到这些线程都停留在semaphore_wait_trap

除了主线程,其他线程也是停留在semaphore_wait_trap

查看到dispatch_semaphore_wait调用的地方,发现dispatch_semaphore_wait是从系统默认的global queue中调用的。模拟情况如下:

dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
for(i = 0; i < n; i++){
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        [self doSomeThingComplete:^{
            dispatch_semaphore_signal(semaphore);
        }];
    });
}

看起来像是dispatch_async把dispatch_semaphore_wait用dispatch_global_queue分派到所有线程,然后堵死了所有线程。
具体发生情况,后续更新

上一篇下一篇

猜你喜欢

热点阅读