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