免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2152 | 回复: 0
打印 上一主题 下一主题

如何使用条件变量让线程睡眠 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-12 17:03 |只看该作者 |倒序浏览
在网上(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就搞定了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP