我想描述一下我的守护程序,它会暂停主线程:
sigset_t signal_mask;
sigemptyset(&signal_mask);
sigaddset(&signal_mask, SIGTERM);
sigaddset(&signal_mask, SIGINT);
int sig;
sigwait(&signal_mask, &sig);
所有其他线程只是阻止所有信号。
据我所知,探查器使用SIGPROF
信号进行操作。如果我使用这样的代码开始分析,则输出.prof文件为空:
env CPUPROFILE = daemon.prof ./daemon
如何正确处理主线程和其他线程中的信号以启用性能分析?或者可能是其他地方的问题?
答案 0 :(得分:1)
所有其他线程只是阻止所有信号。
您只需要在所有线程(或您要分析的线程)中取消阻止SIGPROF
。我们只是在多线程守护进程中解决完全相同的问题。
答案 1 :(得分:0)
我需要查看更多代码,但是您的声明“所有其他线程只是阻止所有信号”会引发...信号。
您必须记住,大多数系统调用是在线程概念存在之前创建的。信号处理就是其中之一。因此,当您阻止任何线程上的信号时,它可能会阻塞所有线程。
事实上,请查看signal(2)联机帮助页:
The effects of signal() in a multithreaded process are unspecified.
是的,这很难过,但这是使用低开销统计抽样分析器必须支付的价格。并且解决它非常简单:只需从信号掩码集中删除SIGPROF(如果使用REAL模式,则删除SIGALRM),你应该没问题。
一般情况下,除非你必须这样做,否则你不应该在主线程以外的任何东西中进行进程级别的信号屏蔽......其中“main”并不一定意味着MAIN()正在运行的线程在你看来,你认为是所有其他人的“老板”,因为你已经把它弄得太清楚了。 :)
您也可以尝试使用pthread library's sigmask wrapper pthread_sigmask,,但我不清楚它在子线程中移除sigmask中的条目(pthreads继承其父级的pthread sigmask)等情况下的效果如何。