multithreading - Cocoa OSX 应用程序卡在dispatch_async 上

标签 multithreading macos cocoa grand-central-dispatch

我的应用程序会触发一个线程,专门用于检查进程的状态。每 5-10 秒触发一次:

if(!monitorTask){
        MYLog(100,@"Monitor task is dead");
        return;
}
dispatch_async(monitorTask,^{ // fuckup here
        MYLog(150,@"...Checking iTunes");

但是它似乎也经常卡在那里:

enter image description here

有什么线索可以解决/捕获这个问题吗?该应用程序正在沙滩上玩耍,但在 Xcode 中“运行”得很好 - 遵循此指令:

enter image description here

最佳答案

你确定monitorTask的类型是dispatch_queue_t吗? See these Apple guides for an example of how to create a serial queue

尽管我在您的评论中看到您正确创建了队列。

队列也有可能在您可以分派(dispatch)给它之前被释放。您可能需要perform some memory management放在您的队列中,以确保在您调度之前它不会被释放。

最后值得注意的是,串行队列总体上用于保护共享资源。如果您只是尝试对资源执行定期检查(一项永远不会写入而只会读取的任务),那么您最好使用并发队列(您可能应该只使用 4 given global queues, 之一)

或者因为您似乎在应用程序的整个生命周期中不断进行检查,您甚至可以考虑使用 Dispatch Source ,更具体地说是定时器调度源

关于multithreading - Cocoa OSX 应用程序卡在dispatch_async 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32248857/

相关文章:

objective-c - NSString.length 给出 EXC_BAD_ACCESS

python - Python 3.4 中多线程如何工作?

Php 更新(包 5.5-frontenddev 已经安装)?

multithreading - 在 Lparallel 库 (Common Lisp) 中使用队列

macos - GLSL几何着色器是否在OSX下的GMA X3100上工作

Python 'Logger' 模块双重记录

objective-c - 使用 NSDictionary 或 NSMutableArray 构建用户配置文件

macos - 当我双击文件并且应用程序尚未运行时,我的应用程序无法打开文件

c++ - 使用线程和互斥量时出现双重释放或损坏 (!prev) 错误

java - 如何防止我的消费者线程两次删除最后一个元素?