美文网首页
记一次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