源代码:
sem_t set;
set_init(&sem,0,0);
int i = 0;
while(i < 100)
{
struct timespec ts;
ts.tv_sec = time();
ts.tv_nsec = 998*1000*1000;
sem_timedwait(&sem,&ts);
}
原意:函数循环100次,每次等待998ms。结果:函数瞬间结束
原因分析:
按照man 的解释使用sem_timedwait,用time()取时间,原以为是set_timedwait的精确性有问题,看来是冤枉它了。
time()函数返回当前绝对时间的秒级数据。
1、假设第一次循环之前绝对时间为1s990ms,则函数等待到1s998ms。等待时间为9ms。
第二次设置时间:秒数仍为1s,而微秒级为998ms,这个时间已经在第一次循环到了,则函数不等待立即返回。
以后98次相同。(统计以后的99次只运行了不到1ms,可见计算机的速度)
2、假设第一次循环之前绝对时间为1s999ms,则时间已经过了,函数不等到立即返回。
可能以后的某个循环秒设置为2,再等待到998ms。不过这时等待时间已经不准确
解决方法:得到当前精确的时间,本函数可以精确到1毫秒,不过对于大部分应用已经足够了,呵呵
sem_t set;
set_init(&sem,0,0);
int i = 0;
while(i < 100)
{
struct timespec ts;
struct timeval tt;
gettimeofday(&tt,NULL);
ts.tv_sec = tt.tv_sec;
ts.tv_nsec = tt.tv_usec*1000 + x * 1000 * 1000;//这里可能造成纳秒>1000 000 000
ts.tv_sec += ts.tv_nsec/(1000 * 1000 *1000);
ts.tv_nsec %= (1000 * 1000 *1000);
sem_timedwait(&sem,&ts);
i++;
}