我有一个处理线程用于填充数据缓冲区。在其他地方,一块硬件触发从该数据缓冲区读取的回调。然后处理线程启动并重新填充缓冲区。
当缓冲区填满时,我正在告诉线程等待:
while( [self FreeWriteSpace] < mProcessBufferSize && InActive) {
[NSThread sleepForTimeInterval:.0001];
}
然而,当我描述我在睡眠中花费了大量的CPU时间。还有更好的等待方式吗?我是否甚至关心配置文件是否说时间花在睡眠中?
答案 0 :(得分:8)
在睡眠中度过的时间实际上是免费的。在仪器中,查看“运行样本”而不是“所有样本”。但这仍然不是一个理想的解决方案。
首先,你的睡眠间隔很疯狂。你真的需要.1μs的粒度吗?系统几乎肯定不会给你,因为处理器并不那么快。我不得不相信你可以把这个增加到.1或.01。但是,如果你能提供帮助的话,这仍然是忙碌的等待,这是不理想的。
更好的解决方案是使用NSCondition
。在这个线程中,等待条件,并在处理线程中,当有空间写入时触发条件。
请注意您的命名。不要使用前导大写字母命名方法(表示它是类名)。并避免像这样直接访问ivars(InActive)。 “InActive”也是一个非常令人困惑的名字。是指系统处于活动状态(处于活动状态)还是未处于活动状态(处于非活动状态) Objective-C中的命名非常重要。编译器不会像C#和C ++那样保护您。良好的命名是你保持程序运作的方式,ObjC的很多部分都依赖它。
您可能还想调查Grand Central Dispatch,它专门针对这些问题而设计。查看dispatch_async()
以在新数据进入时运行。
答案 1 :(得分:2)
然而,当我描述我得到了一个 在睡眠中花费的大量CPU时间。是 还有更好的等待方式吗?我甚至是 关心配置文件是否说时间 在睡梦中度过?
是的 - 从不,从不投票。轮询会占用CPU,使您的应用程序响应性降低,使用电池,并且是一种全面的浪费。
通知。
最简单的方法是使用“在主线程上执行选择器”的变体之一(请参阅NSThread的文档)。或者调度到队列(包括dispatch_async(dispatch_get_main_queue(), ^{ ... yo, data be ready ...});
)。