- 论坛徽章:
- 0
|
在网上(http://www.itwenku.com/linux/3/11923.htm)看到一个帖子,说是使用pthread_cond_timedwait使线程睡眠,不能精确到微秒级别,只能精确到秒。
引用原帖中内容:
“我设置了下面的值:
ts.tv_sec = time(NULL);
ts.tv_nsec=1000;
然后把子线程中的usleep都去掉,可超时就是不起作用啊?就是把ts.tv_nsec的值设成1000000也一样没用,郁闷”。
给个参考代码(msec是毫秒,如果要做成微秒级别,修改一下就行了),以防还有兄弟犯类似错误,呵呵:
void sleep_thread(int msec)
{
struct timespec wake;
struct timeval now;
int nsec;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
gettimeofday(&now, NULL);
nsec = now.tv_usec * 1000 + (msec % 1000) * 1000000;
wake.tv_sec = now.tv_sec + msec / 1000 + nsec / 1000000000;
//如果把上面的两句替换成下面的两句,就是实现微秒级别睡眠
//nsec = now.tv_usec * 1000 + (msec % 1000000) * 1000;
//wake.tv_sec = now.tv_sec + msec / 1000000 + nsec / 1000000000;
wake.tv_nsec = nsec % 1000000000;
pthread_mutex_lock(&mutex);
pthread_cond_timedwait(&cond, &mutex, &wake);
pthread_mutex_unlock(&mutex);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
}
顺便说一下,其实使线程睡眠没必要那么复杂,用sleep, usleep就行(在Linux上,它们是使线程睡眠,Unix上怎样实现的,我没验证过)。要跨平台,用一些跨平台类库如APR的apr_sleep就搞定了。 |
|