【发布时间】:2011-06-06 15:16:35
【问题描述】:
我正在做一个 VoIP 程序,它不断检查音频记录缓冲区中是否有任何内容(FMOD 库,只要函数 getRecordPosition > 0,那么缓冲区中就有数据)。
所以应该是这样的:
while (true) {
if(getRecordPosition>0) {
process data....
}
}
但是,这会导致非常高的 CPU 使用率。一个版本是使用 sleep() 但如果可能的话我宁愿不使用它。 例如,带有事件驱动循环的 win32 消息处理不会消耗很多 cpu 周期,这是我试图模仿的东西。同时我明白函数 getRecordPosition() 必须经常调用,看看返回值是否高于 0。
为了保持较低的 CPU 使用率,我是否坚持执行 while(true) 循环和 sleep() 一小段时间?
我已经用谷歌搜索并进行了一些查找,但大多数返回是使用 sleep() 或与 mutex 进行的一些 POSIX 同步。 (我正在做一个 c++ win32 应用程序)
干杯
---编辑:忘了说我无权访问 fmod 源代码:/ ---
【问题讨论】:
-
你控制录音缓冲区吗?
-
你有控制数据写入缓冲区的点吗?
-
如果您提到不想睡觉的原因,也许会有所帮助。调用 Sleep 是执行此操作的正常方法,因为它释放线程的时间片并允许其他线程/进程运行。
-
睡眠是浪费,就像旋转是浪费一样,只是稍微少一些。此外,它是非确定性的。
-
如果你想要一个事件驱动的系统,你需要 FMOD 在缓冲区准备好时提醒你的进程或线程。
getRecordPosition()是如何工作的?
标签: c++ multithreading winapi synchronization cpu-usage