Отправить сигнал потоку только тогда, когда поток работает - PullRequest
0 голосов
/ 05 ноября 2011

В linux у меня есть установка, в которой я создаю поток профилировщика, который обрабатывает его родительский поток сигналами SIGPROF для профилировщика выборки. Я посылаю сигнал явно, а не полагаюсь на setitimer для лучшего контроля. Возможно, мне придется пересмотреть это, но пока предположим, что я сам посылаю сигналы.

Моя проблема в том, что это посылает сигналы постоянно, даже когда профилированный поток спит в системном вызове. Таким образом, я получаю недопустимые значения в моем кольце буфера выборки.

Есть ли какой-нибудь способ определить состояние выполнения профилированного потока, даже если он может измениться сразу после того, как я его проверил? Или, что еще лучше, отправить условный сигнал о том, что цель находится в рабочем состоянии?

Я мог бы подделать его, атомно увеличивая счетчик в обработчике сигнала профилированного потока и проверяя, изменился ли он из потока профилировщика:

  volatile int samples;
  while(1) {
    int old_samples = samples;
    pthread_kill(profiled_thread, SIGPROF);
    while (samples == old_samples)
      usleep(appropriate amount);
  }

или что-то, но мне интересно, есть ли лучший способ. (Приведенный выше код упрощает расчет задержки, поскольку на самом деле весь смысл в том, чтобы иметь несмещенные выборки, но пока игнорируйте это.)

Ответы [ 2 ]

0 голосов
/ 08 ноября 2011

Есть пара проблем , которые я вижу с кодом.

1) Использование volatile для переменных сэмплов не гарантирует, что у вас нет состояния гонки с того момента, как выприсвойте его old_samples оператору while.Если это не то, что вы хотите, устаревшая ценность.; -)

2) pthread_kill () кажется правильным способом отправки сигнала определенному потоку.Однако откуда вы знаете, что он будет обработан до того, как будет отправлен другой сигнал?Как долго длится очередь сигналов?Может ли сигнализируемый поток «сигнализировать» назад (какое-то условное ожидание), что он обработал сигнал?Какая-то переменная ожидающего сигнала типа производитель / потребитель?

0 голосов
/ 07 ноября 2011

Я на самом деле думаю, что прерывания во время системных вызовов - хорошая вещь, если вы можете сделать выборку стека в то время, как в этом посте (пункты 7, 1).Более того, нет особой ценности в получении большого количества образцов (пункты 5, 9).

...