iOS线程等待操作

Tur*_*age 4 iphone objective-c nsthread ios

我有一个处理线程,我用它来填充数据缓冲区.在其他地方,一块硬件触发从该数据缓冲区读取的回调.然后处理线程启动并重新填充缓冲区.

当缓冲区填满时,我正在告诉线程等待:

while( [self FreeWriteSpace] < mProcessBufferSize && InActive) {
    [NSThread sleepForTimeInterval:.0001];
}
Run Code Online (Sandbox Code Playgroud)

但是当我描述我在睡眠中花费了大量的CPU时间.还有更好的等待方式吗?我是否甚至关心配置文件是否说时间花在睡眠中?

Rob*_*ier 8

睡眠时间实际上是免费的.在仪器中,查看"运行样本"而不是"所有样本".但这仍然不是一个理想的解决方案.

首先,你的睡眠间隔很疯狂.你真的需要.1μs的粒度吗?系统几乎肯定不会给你,因为处理器并不那么快.我不得不相信你可以把这个增加到.1或.01.但是,如果你能提供帮助的话,这仍然是忙碌的等待,这并不理想.

更好的解决方案是使用NSCondition.在这个线程中,等待条件,并在处理线程中,当有空间写入时触发条件.

你的命名要小心.不要使用前导大写字母命名方法(表示它是类名).并避免像这样直接访问ivars(InActive)."InActive"也是一个非常令人困惑的名字.是指系统处于活动状态(处于活动状态)还是未处于活动状态(处于非活动状态)Objective-C中的命名非常重要.编译器不会像C#和C++那样保护您.良好的命名是你保持程序运作的方式,ObjC的很多部分都依赖它.

您可能还想调查Grand Central Dispatch,它专门针对这些问题而设计.查看dispatch_async()新数据进入时的运行情况.

  • 请注意,使用队列甚至比旋转线程并让它等待更好; 线程,甚至停放的线程,消耗资源.您的应用中已经有一个主队列和全局并发队列.在数据准备就绪时排队"嘿,数据准备就绪"块完全是用户空间操作 - 与旋转线程相比非常便宜. (2认同)