您的位置:首页 > 大数据 > 人工智能

sem_timedwait 等待时间小于1s时的精确性

2012-05-18 11:55 791 查看
源代码:

 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++;

 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struct null