2011-11-05 101 views
0

在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

我实际上认为系统调用期间的中断是一件好事,如果你可以在那里对栈进行采样时间,如this post(第7,1点)。 更重要的是,获取大量样本没有特别的价值(第5,9点)。

0

有几个问题,我看到的代码。

1)对变量样本使用volatile不能保证从将它分配给old_samples到while语句时没有竞争条件。除非这是你想要的,否则陈旧的价值。 ;-)

2)pthread_kill()似乎是向特定线程发送信号的正确方法。但是,您如何知道在发送另一个信号之前它会被处理?队列信号有多长?信号线程“信号”能够返回(有条件等待某种类型)它已经处理了信号吗?某种生产者/消费者类型挂起的信号变量?