Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 仅当线程正在运行时才向线程发送信号_Linux_Multithreading_Signals_Profiler - Fatal编程技术网

Linux 仅当线程正在运行时才向线程发送信号

Linux 仅当线程正在运行时才向线程发送信号,linux,multithreading,signals,profiler,Linux,Multithreading,Signals,Profiler,在linux上,我有一个生成探查器线程的设置,该线程使用采样探查器的SIGPROF信号爆破其父线程。我显式地发送信号,而不是依赖setitimer来实现更好的控制。我可能需要重新考虑这一点,但现在假设我是自己发出信号的 我的问题是,这会一直发送信号,即使是在已分析的线程在系统调用中休眠时也是如此。这样,我的样本环缓冲区就会出现不足 是否有某种方法可以检测已分析线程的运行状态,即使在我检查后它可能会立即更改?或者更好的是,在目标处于运行状态的情况下发送信号 我可以通过原子地增加已分析线程的信号处理

在linux上,我有一个生成探查器线程的设置,该线程使用采样探查器的SIGPROF信号爆破其父线程。我显式地发送信号,而不是依赖setitimer来实现更好的控制。我可能需要重新考虑这一点,但现在假设我是自己发出信号的

我的问题是,这会一直发送信号,即使是在已分析的线程在系统调用中休眠时也是如此。这样,我的样本环缓冲区就会出现不足

是否有某种方法可以检测已分析线程的运行状态,即使在我检查后它可能会立即更改?或者更好的是,在目标处于运行状态的情况下发送信号

我可以通过原子地增加已分析线程的信号处理程序中的计数器并检查它是否已从分析线程中更改来伪造它:

volatile int samples; while(1) { int old_samples = samples; pthread_kill(profiled_thread, SIGPROF); while (samples == old_samples) usleep(appropriate amount); } 挥发性int样品; 而(1){ int old_样本=样本; pthread_kill(profiled_thread,SIGPROF); while(样本==旧样本) usleep(适当金额); }
或者别的什么,但我想知道有没有更好的办法。(上面的代码简化了延迟计算,因为真正的关键是要有无偏的样本,但现在忽略它。)

我实际上认为系统调用期间的中断是一件好事,如果您当时可以对堆栈进行采样,如(第7点,第1点)。 此外,获取大量样本(第5点、第9点)没有什么特别的价值。

我看到代码中存在一些问题

1) 对变量样本使用volatile并不保证在将其分配给while语句的旧_样本时没有竞争条件。除非这是您想要的,否则是一个过时的值。;-)

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