[Objective-C]semaphore_wait() 突然中止

发布时间: 2016/9/21 5:24:49
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有一个应用程序与创建为一个线程

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

});

我的所有其他线程暂停和恢复此线程的执行。 在此线程在 semaphore_wait() 函数中旋转,同时暂停应用程序或添加一些象征性的断点立即使其退出此 semaphore_wait(),虽然它不必须。 我不知道原因。它可能是导致这种行为的 XCode(4.5) 吗?

解决方法 1:

看来那 lldb SIGSTOP 消息的问题。检查以下 lldb 版本。

155560 修订版

暂停程序线程之前发送 SIGSTOP 和恢复,所以其他线程等待 SIGSTOP,不会惹问题。

rdar://problem/11174834

https://llvm.org/viewvc/llvm-project?view=revision&sortby=log&sortdir=down&revision=155560

问题是当调试是在主线程 semaphore_wait(),semaphore_wait() 在后台线程上的免疫这个 lldb 问题。

此外, dispatch_semaphore_wait()是免疫这一问题的因为它使用dispatch_semaphore_wait_slow()有以下;

case DISPATCH_TIME_FOREVER:
    do {
        kr = semaphore_wait(dsema->dsema_port);
    } while (kr == KERN_ABORTED);

http://www.opensource.apple.com/source/libdispatch/libdispatch-84.5.3/src/semaphore.c

所以,它恢复等待 semaphore_wait() 与 KERN_ABORTED 返回时。

官方微信
官方QQ群
31647020