zoukankan      html  css  js  c++  java
  • sleep函数的BUG

    BUGS
    sleep() may be implemented using SIGALRM; mixing calls to alarm() and sleep() is a bad idea.

    线程里面使用sleep函数来延时/定时是不安全的,原因是:sleep会受到SIGALARM信号的影响,如果在sleep()期间,有SIGALRM信号发送给线程,则立即返回,返回值是剩余的时间。

    ps:sleep函数返回值:是一个无符号的整型,具体返回值是:若进程暂停到参数seconds 所指定的时间则返回0,若有信号中断则返回剩余秒数。

    网上使用了条件变量来完成线程里面的延时,很不错哦~~如下例:

    void thread_sleep(int second)  
    {  
        /*  time wait */  
        struct timespec outtime;  
        pthread_cond_t cond;  
        pthread_mutex_t mutex;  
      
        /*  timer init */  
        pthread_mutex_init(&mutex, NULL);   
        pthread_cond_init(&cond, NULL);  
      
        pthread_mutex_lock(&mutex);  
        outtime.tv_sec = time(NULL) + second;    
        outtime.tv_nsec = 0;  
        pthread_cond_timedwait(&cond, &mutex, &outtime);  
        pthread_mutex_unlock(&mutex);  
    } 

    使用select来做延时,也很常用~不过分辨率是毫秒ms级别

    看代码吧:

      

     1 #include <pthread.h>
     2 #include <stdio.h>
     3 #include <sys/signal.h>
     4 #include <time.h>
     5 #include <sys/time.h>
     6 
     7 int mySleep(int sec, int msec)
     8 {
     9     struct timeval tv;
    10     tv.tv_sec = sec;
    11     tv.tv_usec = msec * 1000;
    12 
    13     select(0, NULL, NULL, NULL, &tv);
    14 
    15     return 0;
    16 }
    17 
    18 int main(int argc, char **argv)
    19 {
    20     int i, j;
    21     int ret;
    22 
    23     long int total_time;
    24     struct timeval tv_start, tv_current;
    25     while(1)
    26     {
    27         gettimeofday(&tv_start, 0);
    28         mySleep(0, 30);
    29         gettimeofday(&tv_current, 0);
    30         total_time = (tv_current.tv_usec - tv_start.tv_usec)/1000;
    31         printf("total time is %ld
    ", total_time);
    32     }
    33     
    34     return 0;
    35 }

      okay,凑合着用用吧~~

  • 相关阅读:
    C#获取url中参数键值对的方法
    一款css3很美的iphone注册表单样式
    很震撼的HTML5视频播放器,电影院的感觉
    html5菜单折纸效果
    web服务器之nginx与apache
    安装win8、ubuntu双系统的过程
    新学C#线程使用总结
    人民币大写金额转换C#方法
    可以调整gif动画图片尺寸的很实用的php类
    JS获取html对象的几种方式说明
  • 原文地址:https://www.cnblogs.com/cyc2009/p/3974955.html
Copyright © 2011-2022 走看看