我有一个捕获程序,除了捕获数据并将其写入文件外,还打印一些统计信息。打印统计信息的函数
static void report(void)
{
/*Print statistics*/
}
大约每秒调用一次,使用每秒到期的警报。所以该程序就像
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
flag.如果设置了该标志report()
被调用清除标志。
当主线程中的计时器关闭时,如何唤醒休眠线程(运行report())?
您可以使用 sigwait 休眠线程,然后使用 pthread_kill 通知该线程唤醒。 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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)