В linux у меня есть установка, в которой я создаю поток профилировщика, который обрабатывает его родительский поток сигналами SIGPROF для профилировщика выборки. Я посылаю сигнал явно, а не полагаюсь на setitimer для лучшего контроля. Возможно, мне придется пересмотреть это, но пока предположим, что я сам посылаю сигналы.
Моя проблема в том, что это посылает сигналы постоянно, даже когда профилированный поток спит в системном вызове. Таким образом, я получаю недопустимые значения в моем кольце буфера выборки.
Есть ли какой-нибудь способ определить состояние выполнения профилированного потока, даже если он может измениться сразу после того, как я его проверил? Или, что еще лучше, отправить условный сигнал о том, что цель находится в рабочем состоянии?
Я мог бы подделать его, атомно увеличивая счетчик в обработчике сигнала профилированного потока и проверяя, изменился ли он из потока профилировщика:
volatile int samples;
while(1) {
int old_samples = samples;
pthread_kill(profiled_thread, SIGPROF);
while (samples == old_samples)
usleep(appropriate amount);
}
или что-то, но мне интересно, есть ли лучший способ. (Приведенный выше код упрощает расчет задержки, поскольку на самом деле весь смысл в том, чтобы иметь несмещенные выборки, но пока игнорируйте это.)