在linux上,我有一个设置,我在其中产生一个探查器线程,该线程使用SIGPROF信号为其采用探测器爆发其父线程。我明确发送信号而不是依赖setitimer来更好地控制。我可能需要重新考虑这一点,但现在假设我自己发送信号。
我的问题是,即使配置文件的线程在系统调用中休眠,它也会一直发送信号。我通过这种方式在样本环缓冲区中获得了不足。
是否有某种方法可以检测配置文件的运行状态,即使它在检查后可能会立即更改?或者更好的是,以目标处于运行状态为条件发送信号?
我可以通过在配置文件线程的信号处理程序中以原子方式递增计数器并检查它是否从探查器线程更改来伪装它:
volatile int samples; while(1) { int old_samples = samples; pthread_kill(profiled_thread, SIGPROF); while (samples == old_samples) usleep(appropriate amount); }
或其他什么,但我想知道是否有更好的方法。 (上面的代码简化了延迟计算,因为真正的重点是拥有无偏的样本,但现在忽略它。)
答案 0 :(得分:0)
我实际上认为系统调用期间的中断是一件好事,如果你可以在那时采样堆栈,如this post(第7,1点)。 更重要的是,获取大量样本没有特别的价值(第5,9点)。
答案 1 :(得分:0)
我在代码中看到了几个问题。
1)对变量样本使用volatile不保证从将old_samples分配给while语句时没有竞争条件。除非这是你想要的,一个陈旧的价值。 ; - )
2)pthread_kill()似乎是向特定线程发送信号的正确方法。但是,你怎么知道它会在另一个信号被发送之前处理?队列发出多长时间信号?发信号的线程可以“发出信号”回来(某种类型的条件等待)它已经处理了信号吗?某种生产者/消费者类型待定信号变量?