以前,pthread_cond_timedwait ) )讨论过不能使用接口。 如果需要超时返回功能,就必须写计时器来实现。 但是这个操作太贵了。 实际上,您可以直接使用这个界面来实现等待超时的功能。 下面我来说明一下我对这个接口的了解和使用方法。 仅供参考。
1.POSIX提供了多种时钟类型,包括以下两种类型的:
clock _ real time:systemwiderealtimeclock .整个系统的实时时钟是可以通过命令等修改系统时间的软件时钟。
clock _ monotonic:representsmonotonictime.cannot beset .表示单调时间,是从系统启动时到现在的时间,不能设置或修改。
如果没有设置条件变量的属性,pthread_cond_timedwait ()默认使用CLOCK_REALTIME软件时间,因此在极端情况下,实际等待时间和设置的超时时间不同
本节介绍如何正确使用pthread_cond_timedwait ()接口
pthread_cond_timedwait (正确使用接口方法,将测量时间引用更改为CLOCK_MONOTONIC )。 这需要在初始化时设置条件变量的属性,然后设置超时时间。 示例为以下:
ret=pthread_condattr_init () pthread_info.condattr );
if(ret!=0}{
退出(1;
}
ret=pthread_condattr_setclock () pthread_info.condattr ),CLOCK_MONOTONIC );
ret=pthread_cond_init () pthread _ info.clean up _ queue _ wait ),) pthread_info.condattr );
.
结构时间片段电视;
时钟_ gettime (clock _ monotonic,tv );
pthread_task_DBG(logs_debug,' nowtime:%dn ',tv.tv_sec );
电视.电视_ sec=30; -此处设置为30秒后返回而不接收事件超时
ret=pthread_cond_timedwait () pthread _ info.clean up _ queue _ wait ),) pthread _ info.clean up _ qu queue _ t
.
执行以下:
从以上可见,在这种方式中,无论系统时间设置了什么值,系统执行时间都不会改变,并且线程保持原始30秒的超时。
3 .实际上,也可以使用CLOCK_REALTIME作为测量时间的参考。 但是,在极端情况下,例如,如果在获取当前系统时间后立即修订了系统时间,则此超时时间不准确,但这是一个低概率事件。
作为例子,以下:
结构时间片段电视;
电视. TV _ sec=time (null; -极端情况下,系统时间将在获取当前系统时间后立即修订
pthread_task_DBG(logs_debug,' nowtime:%dn ',tv.tv_sec );
电视.电视_ sec=30; -此处设置为30秒后返回而不接收事件超时
ret=pthread_cond_timedwait () pthread _ info.clean up _ queue _ wait ),) pthread _ info.clean up _ qu queue _ t
执行以下:
综上所述,在此方法中,线程等待超时后,如果将系统时间更改为前后时间,time(null )将返回当前设置后的时间,但线程不会被触发而返回。
4 .参考资料:
3358 man.chinaunix.net/UNIX/sus v3/functions/pthread _ condattr _ set clock.html
3358 man.chinaunix.net/UNIX/sus v3/functions/pthread _ cond _ timedwait.html