c/c++语言开发共享如何从主线程唤醒睡眠线程?

我有一个捕获程序,此外捕获数据并将其写入文件还打印一些统计信息。打印统计信息的function

static void report(void) { /*Print statistics*/ } 

使用每秒过期的ALARM大致每秒调用一次。所以程序就像

 void capture_program() { pthread_t report_thread while() { if(pthread_create(&report_thread,NULL,report,NULL)){ fprintf(stderr,"Error creating reporting thread! n"); } /* Capturing code -------------- -------------- */ if(doreport) /*wakeup the sleeping thread.*/ } } void *report(void *param) { //access some register from hardware //sleep for a second } 

计时器到期时设置doreport标志。如果设置了此标志,则调用report()来清除该标志。

当计时器在主线程中关闭时,如何唤醒睡眠线程(运行report())?

    当计时器在主线程中关闭时,如何唤醒睡眠线程(运行report())?

    我认为条件变量是您正在寻找的机制。 在条件变量上有报告线程块,并且只要您希望报告线程被唤醒,主线程就会发出条件变量信号(有关详细说明,请参阅链接)。

    您可以使用sigwait来hibernate线程,然后通过pthread_kill发出该线程的信号。 杀死听起来不错,但它并没有杀死线程,它会发出信号。 这种方法非常快。 它比条件变量快得多。 我不确定它是否更容易,更难,更安全或更危险,但我们需要性能,所以我们走了这条路。

    在启动代码中的某个地方:

     sigemptyset(&fSigSet); sigaddset(&fSigSet, SIGUSR1); sigaddset(&fSigSet, SIGSEGV); 

    睡觉,线程这样做:

     int nSig; sigwait(&fSigSet, &nSig); 

    醒来(从任何其他线程完成)

     pthread_kill(pThread, SIGUSR1); 

    或者醒来你可以这样做:

     tgkill(nPid, nTid, SIGUSR1); 

    我们的代码在创建子线程之前在主线程上调用它。 我不确定为什么要这样做。

     pthread_sigmask(SIG_BLOCK, &fSigSet, NULL); 

      以上就是c/c++开发分享如何从主线程唤醒睡眠线程?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/523004.html

      (0)
      上一篇 2020年12月11日
      下一篇 2020年12月11日

      精彩推荐