在项目中的一个模块要进行相应的时间延时的操作,自己对UNIX系统编程这块不太了解,在google上查了一下,基本上使用sleep和usleep,select和条件变量来实现,下面分别的介绍一下。
1.sleep函数是能够进行秒级的延时操作。
2.usleep是能够进行微秒级别的延时。 这个是man手册上说的:The usleep() function suspends execution of the calling process for (at least) usec microseconds. The sleep may be lengthened slightly by any system activity or by the time spent processing the call or by the granularity of system timers. 这里面说的是process,小弟有个疑问了,这个usleep能否用到线程上呢?是不是会造成其他的线程阻塞呢?自己实验了一下,结果证明sleep和usleep并不会造成其他线程的阻塞。但是用他们会产生一些未知的问题。
3.select实现延时的操作;int select(int nfds, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval *timeout);
这个采用多路转接的方法,从select返回的时候会告诉我们:已经准备好的描述符的数量和对于读,写或异常这三个状态中的一个,哪些描述符已经准备好。其中最后的一个参数说明它愿意等待的时间:
struct timeval {
long tv_sec; /*seconds*/
long tv_usec; /*and microseconds*/
}
在等待的指定秒数和微秒数不为0时候,当指定的描述符之一准备好,或者当指定的时间值超过的时候立即返回,这样的select实现的延时可以被捕捉到的信号中断。
struct timeval t;
int ret;
t.tv_sec = 0;
t.tv_usec = 100000;
ret = select(0, NULL, NULL, NULL, &t);
if (ret != 0)
perror("delay failed!");
}
return (NULL);
}
4. 用条件变量来实现延时的操作;
pthread_cond_t mycond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;
struct timespec ts;
int rv;
ts.tv_sec = 0;
ts.tv.nsec = 500000; /* 500,000 nanoseconds = 500 ms */
pthread_mutex_lock(&mymutex);
rv = pthread_cond_timedwait(&mycond, &mymutex, &ts);
switch(rv) {
case ETIMEDOUT:
/* Handle timeout */
case EINTR:
/* Interupted by signal *.
case EBUSY:
default:
/* Handle errors */
case 0:
/* condition received a condition signal */
}
pthread_mutex_unlock(&mymutex);
阅读(3193) | 评论(0) | 转发(0) |