记一次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分派到所有线程,然后堵死了所有线程。
具体发生情况,后续更新