iOS-如何测量线程唤醒?

iOS-如何测量线程唤醒?,ios,multithreading,instruments,Ios,Multithreading,Instruments,我有一个应用程序由于太多的“线程唤醒”而崩溃。例如: 在过去220秒内唤醒45004次(每次唤醒205次) 秒平均值),超过300秒内每秒150次唤醒的限制 这很难调试,因为我不知道直接测量线程唤醒的方法。我找到的最接近的模板是名为System Trace的Instruments模板,它将显示阻塞线程事件的数量。这可能是密切相关的,因为阻塞线程意味着该线程将睡眠,然后在解除阻塞时醒来 奇怪的是,当应用程序正常运行且没有崩溃时,被阻止的线程数在每秒10000个的范围内。我的假设是,在某些情况下,阻

我有一个应用程序由于太多的“线程唤醒”而崩溃。例如:

在过去220秒内唤醒45004次(每次唤醒205次) 秒平均值),超过300秒内每秒150次唤醒的限制

这很难调试,因为我不知道直接测量线程唤醒的方法。我找到的最接近的模板是名为System Trace的Instruments模板,它将显示阻塞线程事件的数量。这可能是密切相关的,因为阻塞线程意味着该线程将睡眠,然后在解除阻塞时醒来

奇怪的是,当应用程序正常运行且没有崩溃时,被阻止的线程数在每秒10000个的范围内。我的假设是,在某些情况下,阻塞的休眠线程只会计入“唤醒”限制,例如,我希望由于互斥锁而锁定的线程会计入,而操作系统只是在正常操作中转换到其他线程不会计入

如果Instruments有一个线程唤醒模板,我会感到惊讶。我能找到的唯一文档在这里-:

异常子类型
WAKEUPS
表示进程中的线程每秒被唤醒的次数过多,这会迫使CPU频繁唤醒,并消耗电池寿命

通常,这是由线程到线程的通信(通常使用
peformSelector:onThread:
dispatch\u async
)造成的,这种通信在无意中发生的频率远远超过了应有的频率。由于触发此异常的通信种类非常频繁,因此通常会有多个具有非常相似的背景线程-指示通信的起始位置


如果这是上下文切换的结果,您可能需要查看哪些方法涉及减少不必要的上下文切换。如果您想查看这些上下文切换,请使用Instruments的“系统跟踪”工具,您将在那里看到“上下文切换”。是,我们已经查看了系统跟踪工具,并查看了上下文开关部分中的阻塞线程(根据描述)。没有“线程唤醒”,只有“阻塞”线程。线程唤醒工具是个好主意。我建议每个人都用雷达来实现这一点(我只是,rdar://42114101)弗雷德里克