循环不消耗太多CPU周期而没有睡眠()?

Kai*_*aan 7 c++ winapi multithreading synchronization cpu-usage

我正在做一个VoIP程序,它不断检查录音缓冲区中是否有任何内容(FMOD库,只要函数getRecordPosition> 0,然后缓冲区中就有数据).

所以这将是:

while (true) {
    if(getRecordPosition>0) {
     process data....
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这会导致非常高的CPU使用率.一个版本是使用sleep()但是如果可能的话我宁愿不使用它.例如,win32消息处理及其事件驱动的循环不会消耗很多cpu周期,这是我试图模仿的东西.同时我理解函数getRecordPosition()必须经常调用以查看返回值是否高于0.

我是否坚持做一段时间(真实)循环和睡眠()一段时间以保持低CPU使用率?

我用Google搜索并完成了一些查找,但大多数使用sleep()或某些POSIX与mutex同步返回.(我正在做一个c ++ win32应用程序)

干杯

---编辑:忘记提及我没有访问fmod source corde:/ ---

Joh*_*ing 5

如果可以的话,最好的办法是不要像你说的那样模仿事件驱动的架构,而是实际使用事件驱动的架构.我对你的代码一无所知,特别是你是否能够控制录音缓冲区的代码.但是,如果您确实控制了写入缓冲区的代码,那么您可以在写入缓冲区时触发事件:

(psudocude如下)

主线程:

HANDLE buf_event = CreateEvent(...);
// ...
CreateThread(BufferControl, ...);
Run Code Online (Sandbox Code Playgroud)

缓冲区写线程:

OnWriteToBuffer()
{
  buffer.Write(...);
  SetEvent(buf_event);
}
Run Code Online (Sandbox Code Playgroud)

然后在缓冲区中的数据等待的情况下执行某些操作的线程中,等待事件发出信号:

缓冲读取线程

rc = WaitForSingleObject(buf_event, INFINITE);
if( rc == WAIT_OBJECT_0 )
{
  // there's somethign in the buffer
}
Run Code Online (Sandbox Code Playgroud)