奇怪的dispatch_sync崩溃

时间:2016-08-27 00:59:16

标签: objective-c multithreading grand-central-dispatch

我正在尝试调试我的应用程序的一些用户发生的崩溃,不经常以不可重现的方式发生。

堆栈如下所示:

Thread 0 Crashed:
0   libobjc.A.dylib                 objc_msgSend
1   libdispatch.dylib               _dispatch_client_callout
2   libdispatch.dylib               _dispatch_barrier_sync_f_invoke
3   com.myapp.CorePlayer            -[PreoutWorker cancel] + 89

[PreoutWorker cancel]方法如下所示:

- (void)cancel {
    dispatch_sync(_workerQueue, ^{
        if ([self isExecutingI]) {
            ++self -> _act;
            [self -> _device stop];
            [self resetI];
        }
    });
}

该应用程序大量使用线程,但所有其他线程都是空闲或无关的事情。

PreoutWorker对象向其客户端提供thread safe interface(它们总是在主线程上调用它。)在内部,它将工作分派给_workerQueue,这是一个串行调度队列。

在我看来,cancel方法产生此崩溃的唯一方法是objc_msgSend是传递给dispatch_sync的块中的一个调用。

dispatch_sync的标题文档表明这可能是可行的,但对于细节却令人沮丧地模糊:

  

*作为优化,dispatch_sync()调用块上的   当前
  *尽可能的线程。

有没有人知道“在可能的情况下”究竟是什么意思?

0 个答案:

没有答案