首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >semaphore_wait()突然中止

semaphore_wait()突然中止
EN

Stack Overflow用户
提问于 2013-12-02 16:52:37
回答 2查看 637关注 0票数 0

我有一个应用程序,它的线程创建为

代码语言:javascript
复制
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

});

我挂起所有其他线程并继续执行该线程。当这个线程在semaphore_wait()函数中旋转时,暂停应用程序或添加一些符号断点会立即导致它退出这个semaphore_wait(),尽管它不能。我不知道原因。可能是XCode(4.5)导致了这种行为吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-07 06:49:51

看来,lldb与SIGSTOP消息有问题。检查下面的lldb修订版。

修订版155560 在发送SIGSTOP &恢复之前挂起程序线程,这样其他线程就不会在我们等待SIGSTOP之前陷入麻烦。 雷达://问题/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()

代码语言:javascript
复制
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一起返回时,它将继续等待。

票数 0
EN

Stack Overflow用户

发布于 2013-12-03 04:06:36

如果您有关于如何在Cocoa中进行异步开发的问题,请参阅以下资源:

但是,简而言之,我们不使用semaphore_wait (或同一类别中的其他函数)。我们绝对不会挂起线程或类似的东西。

当我们绝对需要信号量来在不同的后台线程之间进行通信时,我们使用dispatch_semaphore_createdispatch_semaphore_waitdispatch_semaphore_signal (我从未见过这些信号显示出您所描述的行为)。例如,我将创建一个信号量,在后台线程上等待它,60秒后发出信号,这不会受到调试器中的快速暂停和恢复执行的影响:

代码语言:javascript
复制
// create a semaphore

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);

// wait for signal on background thread (but don't block main thread)

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSLog(@"Waiting ...");

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    NSLog(@"Waiting done.");
});

// after one minute signal the semaphore

double delayInSeconds = 60.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    NSLog(@"About to signal");

    dispatch_semaphore_signal(semaphore);

    NSLog(@"Signal sent");
});

这是一个相当不切实际的例子,信号量的使用也很差,但它说明了如何使用信号量。

但是,不应该在主线程上执行任何阻塞操作,更不要尝试挂起它。事实上,在iOS中,如果在应用程序启动太长时间时阻塞主线程,则看门狗可能会杀死应用程序。

正如您在浏览标准可可异步设计模式视频和并发编程指南时所看到的那样,您将看到分派队列和操作队列的标准用法通常完全消除了对信号量的需求(尽管我们偶尔会使用它们)。

所以,如果你的问题真的是关于semaphore_wait的,也许其他人可以帮你。但是,如果您对适当的Cocoa异步模式有疑问,请让我们知道您从功能上想要完成什么,我们可以为您指明正确的方向。

有几种技术(调度队列、操作队列、线程等)。Cocoa开发人员可以使用,而且每个开发人员都有自己的优点,因此非常适合于这样或那样的场景。但是,我们很少需要再求助于直接线程编程,只是不需要使用semaphore_wait或尝试挂起线程。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20333548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档