对于普通的应用程序,您永远不想这样做。
但是......我正在制作一个教育应用程序,向人们展示不同的线程模型在不同的 iPhone 硬件和操作系统级别上到底会发生什么。 OS 4 从根本上改变了不同的模型(IME:许多现有代码在 OS 4 上运行时不起作用)。
我正在编写一个交互式测试应用程序,它可以让您启动不同模型的线程(选择器主线程、选择器背景、nsoperationqueue 等),并查看 GUI + 主应用程序在发生时会发生什么。
但我想要重现的常见用例之一是:“执行后台下载的线程,然后对结果进行 CPU 密集型解析”。我们在现实应用程序中经常看到这种情况。
这并不完全是微不足道的。 “忙碌”的方式很重要。
那么...我怎样才能模拟这个呢?我正在寻找一种保证不会被优化编译器丢弃的东西(无论是现在,还是使用更好的编译器),并且足以强制线程以最大 CPU 运行大约 5 秒。
注意:在我的实际应用程序中,我注意到当 iPhone 线程繁忙时会发生一些奇怪的事情 - 例如即使设置为较低优先级,后台线程也会导致主线程饥饿。虽然这显然是苹果线程调度程序中的一个错误,但我想制作一个忙碌来演示这一点 - 和/或另一个忙碌来显示当您不在调度程序中触发该行为时会发生什么。
UPDATE:
例如,以下内容可能会产生不同的效果:
for( int i=0; i<1000; i++ )
for( int k=0; k<1000; k++ )
CC_MD5( cStr, strlen(cStr), result );
for( int i=0; i<1000000; i++ )
CC_MD5( cStr, strlen(cStr), result );
...有时,至少,编译器似乎优化了后者(而且我不知道编译器 voodoo 的用途是什么 - 有些构建没有显示任何差异,有些则有:()
更新2:
在第一代 iPhone 上有 25 个线程,每个线程执行一百万个 MD5……并且对 GUI 几乎没有明显的影响。
而使用捆绑的基于 SAX 的解析器的 5 个线程解析 XML 通常会使 GUI 停止运行。
看来 MD5 散列不会触发 iPhone 有缺陷的线程调度程序中的问题:(。我将研究内存分配,看看是否有不同的效果。