objective-c - 在并发队列中使用dispatch_semaphore_t发生死锁

标签 objective-c multithreading macos cocoa grand-central-dispatch

我正在开发一个 MacOS X 应用程序,它使用 GCD 运行大量后台作业。后台作业使用 CLucene 来索引文档,并访问子上下文上的核心数据。

这些作业都是在短时间内生成的(在使用 DISPATCH_QUEUE_CONCURRENT 创建的队列上使用dispatch_async),但只有 4 个作业同时执行实际工作。这是使用dispatch_semaphore_t 来完成的,方法是在作业开始时等待它并在作业完成时释放它。

我在以下情况下看到了一个非常奇怪的、 cocoa 靠重现的死锁:

  1. 后台作业仍在运行
  2. 用户将焦点切换到另一个应用程序,然后再返回

NSWindow 在显示菜单栏时尝试发送通知显然陷入僵局。这是发生这种情况时主线程的堆栈跟踪:


#0  0x00007fff870ae6c2 in semaphore_wait_trap ()
#1  0x00007fff8b1bf486 in _dispatch_semaphore_wait_slow ()
#2  0x00007fff8b69c12b in -[_NSDNXPCConnection sendMessage:waitForAck:] ()
#3  0x00007fff8b57ced5 in _CFXNotificationPost ()
#4  0x00007fff8b58bbf3 in CFNotificationCenterPostNotification ()
#5  0x00007fff902ae174 in HIS_XPC_CFNotificationCenterPostNotification ()
#6  0x00007fff8bd3612a in BroadcastToolboxMessage ()
#7  0x00007fff8bd6d063 in MenuBarInstance::Show(MenuBarAnimationStyle, unsigned char, unsigned char, unsigned char) ()
#8  0x00007fff8bd98144 in SetMenuBarObscured ()
#9  0x00007fff8bd97e0f in HIApplication::HandleActivated(OpaqueEventRef*, unsigned char, OpaqueWindowPtr*) ()
#10 0x00007fff8bd95407 in HIApplication::EventObserver(unsigned int, OpaqueEventRef*, void*) ()
#11 0x00007fff8bd636e0 in _NotifyEventLoopObservers ()
#12 0x00007fff898dc018 in -[NSWindow sendEvent:] ()
#13 0x00007fff898d8744 in -[NSApplication sendEvent:] ()
#14 0x00007fff897ee2fa in -[NSApplication run] ()
#15 0x00007fff89792cb6 in NSApplicationMain ()
#16 0x0000000100001e52 in main at /Users/mspong/dev/Indx/Indx/Indx/main.m:13
#17 0x00007fff86b7b7e1 in start ()

所有正在运行的后台作业都完成了工作,但没有其他作业可以访问上述信号量。每个线程都卡在 semaphore_wait_trap 上。

我无法想象我可能会做什么(显然)导致不相关的信号量(我的和苹果的)被卡住。有人可以就如何进一步调查这个问题提供一些建议吗?

最佳答案

您是否可能达到了 GCD 并发队列线程限制(64 个线程),然后尝试在并发队列上执行某些操作?这会导致整个框架随机死锁。

如果是这种情况,我唯一的建议是:永远不要在并发队列中阻塞。

关于objective-c - 在并发队列中使用dispatch_semaphore_t发生死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13148684/

相关文章:

c++ - 使用 std::condition_variable 阻塞无锁队列

objective-c - ManagedObjectContext 从 AppDelegate 返回 nil

iphone - 应用程序设计和 AppDelegate

ios - xcode 保留周期警告仅有时发生

java - 了解此变量的范围和此线程的行为(编辑问题)

C++ std::async 比顺序 for 循环慢

iphone - 内存管理困境, Objective-C

iphone - 如何在nsdictionary中的键上添加数组

c++ - Macports GCC 4.8 无法链接 OSX Lion 上的 c++ 库

macos - 协同设计和产品设计有什么区别?