高效的线程机制,用于永久运行的进程

时间:2011-03-14 14:54:31

标签: iphone objective-c ios4

我有一个我需要几乎永久运行的过程。我正在使用performSelectorInBackground来实现这一点。使用这段代码,我的应用程序正在遭受极大的性能损失,在故障音频中表现出来。在下面的代码中使用分析器,它占用了所有时间的50%。

我想知道这是否是用于永久运行后台进程的最佳线程机制?

其他线程类型如gcd async dispatch运行速度比我的例子快,还是所有线程类型都以相同的速度执行且资源量相同?

有没有办法减少分配给线程进程的资源量?

   [self performSelectorInBackground:@selector(myProgressTask) withObject:nil];

    - (void)myProgressTask {        

        while (doprocess==YES) 
       {
            //execute stuff

       }
   }

3 个答案:

答案 0 :(得分:1)

无论你使用什么技术(pthread,NSThread(它只是pthread的高级包装器),gcd(也是用不同颜色的pthread等),产生一个线程总是很昂贵。

这是一篇非常好的文章,它比较了生成线程和执行某些操作所需的资源/时间:http://cocoawithlove.com/2010/09/overhead-of-spawning-threads.html

但是,正如您所说线程对主线程有性能影响,您可以做两件事:降低线程的优先级,让操作系统知道线程需要更少的CPU周期,或者返回不需要的线程CPU时间回到系统。另一种方法是使用NSRunLoop / CFRunLoop机制来执行操作,但是,这仅适用于其小但重复的操作(从您的代码片段看起来如此)。在运行循环中执行繁重的代码可能不是最好的想法,但它在某种程度上是非阻塞的(直到用代码阻止runloop)并且你没有产生新线程的开销。

答案 1 :(得分:0)

您应该在线程中使用NSRunLoop。 Add timer并在适当的回调中执行内容。您可以通过使计时器无效来停止该循环。您还可以使用线程优先级并选择最符合您需求的线程。 Aldo检查NSThread和NSOperation的文档。

答案 2 :(得分:0)

在向您提供技术答案之前,我建议您重新审视应用程序的整体设计。一直运行一个线程通常是错误的。至少,您应该尝试定期执行函数/回调。

话虽如此,您可以使用低级pthreads库来减少分配给线程的资源量。我所知道的高级机制都没有提供配置细节。使用pthreads(以及您使用的任何其他机制),重要的是不时放弃CPU,以便其他线程可以实际访问它。这就是您遇到性能问题的原因。可能你的应用程序中的其他线程只是挨饿。为了避免这种情况,即使不使用pthread,您也可以在代码中适当地调用usleep()sched_yeld()来定期放弃CPU。其他线程现在有机会执行。

如果您决定切换到pthreads,那么在使用pthread_create()生成线程之前,您可能需要设置其属性以限制使用pthread_attr_setschedparam()分配给它的资源,{{1 }和pthread_attr_setschedpolicy()