当前位置:  技术问答>linux和unix

unix下的定时器问题,在线等待!跟贴有分!

    来源: 互联网  发布时间:2015-04-16

    本文导语:  我在solaris下用C++设计一个多线程的程序,这些线程必须每隔一段时间激发一次。而且不同线程唤醒的时间间隔可能不一样,如,每隔60秒激发一次线程1,每隔300秒激发一次线程2,怎么用定时器去实现这个功能?各位...

我在solaris下用C++设计一个多线程的程序,这些线程必须每隔一段时间激发一次。而且不同线程唤醒的时间间隔可能不一样,如,每隔60秒激发一次线程1,每隔300秒激发一次线程2,怎么用定时器去实现这个功能?各位兄弟姐妹帮帮忙阿,最好有源码,跟贴着有分,分数不够再补!

|
sem_t sem[N];

work_threadN
{
   sem_wait(sem(N))
}

int time_limit[N] = {...};
time_thread
{
    int n[N] = {0}, i;
    while (1)
    {
          sleep(1);
          for (i = 0; i  time_limit[i])
                {
                     n[i] = 0;
                     sem_post(sem[i]);
                 }
           }
    }
}

|
/*******************************************************************
 *
 * compile with -D_POSIX_PTHREAD_SEMANTICS switch;
 * required by sigwait()
 *
 * sigint thread handles delivery of signal. uses sigwait() to wait
 * for SIGINT signal.
 *
 ********************************************************************/
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 
 #include 

 static void    *threadTwo(void *);
 static void    *threadThree(void *);
 static void    *sigint(void *);

 sigset_t       signalSet;
 sem_t sem1;
 sem_t sem2;

 int 
 main(void)
 {
     pthread_t    t;
     pthread_t    t2;
     pthread_t    t3;

     thr_setconcurrency(3);
     sigfillset ( &signalSet );
     /*
      * Block signals in initial thread. New threads will
      * inherit this signal mask.
      */
     pthread_sigmask ( SIG_BLOCK, &signalSet, NULL );

     printf("Creating threadsn");

     /* POSIX thread create arguments:
      * thr_id, attr, strt_func, arg
      */
      sem_init( &sem1 , 0 , 0 );
      sem_init( &sem2 , 0 , 0 );



     pthread_create(&t, NULL, sigint, NULL);
     pthread_create(&t2, NULL, threadTwo, NULL);
     pthread_create(&t3, NULL, threadThree, NULL);

     printf("##################n");
     printf("press CTRL-C to deliver SIGINT to exit.n");
     printf("##################n");

     pthread_join( t , NULL );
     pthread_join( t2 , NULL );
     pthread_join( t3 , NULL );
     
     //thr_exit((void *)0);
 }
 static void *
 threadTwo(void *arg)
 {
     printf("hello world, from threadTwo [tid: %d]n",
                             pthread_self());
     while(1){
      sem_wait(&sem2);
      printf("Thread two running :%d - %dn",
                             pthread_self() , time(NULL));
        fflush(stdout);
     }
     
 }

 static void *
 threadThree(void *arg)
 {
     printf("hello world, from threadThree [tid: %d]n",
                             pthread_self());
     while(1){
      sem_wait(&sem1);
      printf("Thread three running :%d - %dn",
                             pthread_self() , time(NULL));
        fflush(stdout);
     }

 }

 void *
 sigint(void *arg)
 {
     int    sig;
     int    err;

     printf("thread counter [tid: %d] awaiting SIGALRMn",
                             pthread_self());

     
     sigaddset( &signalSet , SIGALRM );
     sigaddset( &signalSet , SIGINT );

     /*****************************************************
      *Attention:you maybe need to modify the code below to be fit for your requestment.
      *****************************************************/
     while(1){
     
      alarm(5);
     
      err = sigwait ( &signalSet, &sig );
      if(sig==SIGINT)break;
     
      sem_post(&sem1);
     
      alarm(5);
     
      err = sigwait ( &signalSet, &sig );
      if(sig==SIGINT)break;
      sem_post(&sem2);
     
     }

     
     printf("Counter thread exit.n");
     exit(0);
 }
 
原理就是先屏蔽所有信号,然后在专用信号处理线程中用sigwait等待你想要的信号。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问,我如何在unix下用c/c++连结数据(oracle)??在线等待!!!!
  • SCO UNIX 5.05下的线程软件包可以从哪里获得?(在线等待)
  • sco unix + sybase,做三层开发,征求一个方案(在线等待!!!)
  • 怎样安装SCO Unix?(在线等待,问题解决,马上结贴)
  • UNIX安装问题?在线等待
  • unix中.z文件怎么解压?在线等待,马上给分!
  • 帮忙怎样写有关 unix下的线程的问题(在线等待,急用,谢谢)
  • 一个简单的进入UNIX的问题 (在线等待)
  • 请问如何在unix批处理中得到批处理参数!read吗?急在线等待!
  • 急!急!急!有一台UNIX WARE服务嚣,非法关机后,系统就启动不起来,一直让我们等待
  • Linux/Unix/POSIX thread 如何等待线程的结束,并且可指定超时?
  • sco unix 5.0 能否从硬盘上做一镜像克隆到东芝笔记本上。急急急,在线等待。
  • 请问win2000server与unix做web服务器哪种安全性更高,在线等待。。。。
  • unix系统中,上传十六进制字符0x11被串口吃掉了,怎么办?救我,在线等待,马上给分!!!
  • 跪求sco unix下串口读写例程!! 最好有源码!! 在线等待!!
  • 急!一个关于jspSmartUpload在Solaris(Unix)上载路径设置的问题!?在线等待!
  • Solaris下FTP问题(Unix高手请进,在线等待)。
  • ################ sco unix的基本问题,涉及到vm ,高手进来看看,在线等待 ################
  • java命名空间java.util.regex类pattern的类成员方法: unix_lines定义及介绍
  • 刚刚接触Unix系统和Unix编程。急需Unix下多线程程序设计和网络Socket程序设计方面的资料。
  • unix/Linux下c++ boost thread库读写锁介绍
  • 关于UNIX的历史 : 1973年,K.Thompson和D.M.ritchie,用C改写UNIX。那么,在此之前,UNIX是用什么写的?
  • php将标准字符串格式时间转换成unix时间戳_strtotime
  • 没有unix系统我如何学习unix
  • php将unix时间戳转换成字符串时间函数(date)
  • unix盘哪里有下载的??哪里有比较好的unix论坛??万分感谢!!!!!!!!!
  • unix/Linux下c/c++ pthread库读写锁函数介绍
  • 急!装完unix5.06,再装win2000。重启后不能进unix.
  • 网络技术 iis7站长之家
  • UNIX支持中文否,请推荐UNIX好书
  • SCO UNIX 5.0用软盘启动之后无法启动UNIX


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3