我正在写一个检查点.我每次运行循环时都会检查.我认为这会浪费大量的CPU时间.我想知道如何每10秒检查一次系统时间?
time_t start = clock();
while(forever)
{
if(difftime(clock(),start)/CLOCKS_PER_SEC >=timeLimit)
{
break;
}
}
Run Code Online (Sandbox Code Playgroud)
非常简短的答案是,如果你是一名新手程序员,这是非常困难的.
现在有几个可能性:
睡了十秒钟.这意味着你的程序基本没有意义.
使用alarm()和信号处理程序.这很难做到,因为你不能在信号处理程序中做任何花哨的事情.
timerfd在I/O循环中使用并集成时序逻辑.
为计时器设置专用线程(然后可以休眠); 这非常困难,因为您需要考虑同步所有共享数据访问.
这里带回家的重点是你的问题没有一个简单的解决方案.您需要将时序逻辑深入地集成到现有的程序流程中.这个流程应该是某种"主循环"(例如I/O多路复用循环,如epoll_wait或select),可能是多线程的,并且该循环应该发现计时器已经触发的事实.
那并没那么简单.
这是一个切线,可能是有启发性的.基本上有两种计算机程序(除了所有其他类型):
一种是尽可能有效地执行一项特定任务的程序,然后完成.例如,这类似于"生成SSL密钥对"或"查找文件中与X匹配的所有行".就程序流而言,这些程序易于编写和理解.
另一种是与用户交互的程序.这些程序无限期地保持不变并响应用户输入.(基本上是任何类型的UI或游戏,但也是一个Web服务器.)从控制流的角度来看,这些程序花费大部分时间来做...... 什么也没做.他们只是空闲等待用户输入.因此,当您考虑如何编程时,如何使程序无所作为?这是"主循环"的核心:它是一个循环,它告诉操作系统保持进程处于睡眠状态,直到发生有趣的事情,然后处理有趣的事件,然后再回到睡眠状态.
直到你明白如何不做任何事情,你才能设计第二类程序.
| 归档时间: |
|
| 查看次数: |
2413 次 |
| 最近记录: |