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++;
}
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++;
}
相关文章推荐
- sem_timedwait等待毫秒
- pthread_cond_timedwait按相对时间等待超时完整示例代码
- 使用pthread_cond_timedwait()超时时间设置问题
- 信号量 sem_timedwait 函数的使用
- pthread_cond_timedwait时间设置
- 25. 为什么客户端在TIME-WAIT状态必须等待2MSL的时间?
- TCP释放连接时为什么time_wait状态必须等待2MSL时间(阅读笔记)?
- WebDriverWait等设置等待时间和超时时间
- MySQL5数据库更改默认等待连接时间(wait_timeout)
- 带超时的等待子进程,timed_wait
- linux 进程间信号量管理程序之sem_timedwait使用
- wait时间到或被中断唤醒时,仍然需要等待获取锁。
- mysql数据库wait_timeout等待时间
- BAT脚本:等待(sleep/wait)固定时间
- sem_timedwait的用法
- mysql设置连接等待时间(wait_timeout)
- pthread_cond_timedwait及Linux下与时间有关的结构体
- 修改系统的TIME_WAIT等待时间和其它的TCP属性
- 关于pthread_cond_timedwait这个方法以及有关时间结构
- 等待时间,time.sleep()和implicitly_wait()