美文网首页
记一次semaphore导致的界面假死

记一次semaphore导致的界面假死

作者: 亲爱的八路 | 来源:发表于2017-12-13 20:43 被阅读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分派到所有线程,然后堵死了所有线程。
具体发生情况,后续更新

相关文章

网友评论

      本文标题:记一次semaphore导致的界面假死

      本文链接:https://www.haomeiwen.com/subject/jvizixtx.html