在编写线程周期调度时,总是需要获取系统时间戳来确定一个业务周期需要多长时间。 我通常这样写:
unsigned int start_tick, used_tick;
while (!stop)
{
start_tick = get_sys_tick(); // 获取系统毫秒级时间戳
task_run(start_tick);
// 计算出一次任务轮循所用的时间,计算该休眠的时间
used_tick = get_sys_tick() - start_tick;
if (used_tick < 100)
ms_sleep(100 - used_tick);
}
// 获取系统毫秒时间戳
unsigned int get_sys_tick()
{
#ifdef _WIN32
//#include
return GetTickCount();
#else
//#include
return times(NULL);
#endif
}
// 跨平台sleep
void ms_sleep(unsigned int ms)
{
#ifdef _WIN32
//winsock.h
Sleep(ms);
#else
//unistd.h
usleep(ms * 1000);
#endif
}
task_run() 函数将每 100 毫秒调用一次,除非调用时间超过 100 毫秒。 task_run需要传入时间,因此如果上面的任务之一设置了较低的循环频率,则可以使用该时间进行比较。
需要注意的是,times(NULL)返回的时间不是微秒! 需要乘以10php获取随机数,精度小于毫秒。 如果你真的想精确到纳秒,你只能使用gettimeofday()。
时代函数是相当神秘的。 有博主说它返回系统时钟数。 需要减去sysconf(_SC_CLK_TCK)来得到时间,但是我写了一个小程序来测试php获取随机数,返回的确实是wall time。 目前,我们的平台使用这个函数来获取 linux 微秒时间戳并没有造成任何问题。