setitimer, SIGALRM и многопоточный процесс (linux, c) - PullRequest
15 голосов
/ 06 апреля 2010

Я хочу использовать setitimer() (или менее вероятно, alarm()) в многопоточном процессе в linux 2.6+ с libc с поддержкой NPTL. Какой поток получит sigalarm (SIGALRM) от ядра?

Спасибо.

2014-04 обновление: как мне установить setitimer() в многопоточной программе, если я хочу написать утилиту профилирования, такую ​​как gperftools's cpuprofile; но в моем инструменте я хочу поддерживать как динамически связанные программы (чтобы можно было внедрить мою собственную библиотеку для профилирования инициализации), так и статически связанные программы (без возможности выполнения ^^^^^^).

Мой текущий инструмент профилирования работает с настройкой setitimer сразу после fork() и до exec(), а также использует ptrace, чтобы получить контроль над целевой программой и захватить SIGPROF / SIGVPROF / SIGALRM, сгенерированный setitimer. Я не знаю точно, как это работает с многопоточными программами.

Ответы [ 2 ]

14 голосов
/ 06 апреля 2010

Из signal (7) Страница man:

Сигнал, ориентированный на процесс, может быть доставлен в любой из потоков, для которого в данный момент сигнал не заблокирован.Если более одного из потоков имеет разблокированный сигнал, то ядро ​​выбирает произвольный поток для доставки сигнала.

Теперь, alarm (2) Страница man сообщаетчто:

alarm () обеспечивает доставку сигнала SIGALRM процессу в считанные секунды.

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

То же самое с setitimer (2) :

Когда истекает время любого таймера, сигнал отправляется процессу, и таймер (потенциально) перезапускается.

Вы можете заблокировать SIGALARM во всех ваших потоках, кроме одного,тогда вы можете быть уверены, что он будет доставлен в этот единственный поток.Предполагая, что вы используете pthreads, вы можете блокировать сигналы с помощью pthread_sigmask () .

6 голосов
/ 14 апреля 2014

В LKML в 2010 году была интересная тема https://lkml.org/lkml/2010/4/11/81: " setitimer против потоков: в какой поток возвращен SIGALRM? CZ ). Автор говорит, что setitimer использовал сигналы для каждого потока по крайней мере за раз до Fedora 5:

... setitimer() имеет гранулярность на поток. Раньше он доставлял SIGALRM от таймера до определенного потока, который вызывал setitimer().

Но в более поздних версиях Fedora поведение было изменено ( "man pthreads", ... "Потоки не используют интервальные таймеры (исправлено в ядре 2.6.12)." )

В теме Энди Клин (Intel) рекомендует переключиться на" POSIX таймеры (timer_create) "; и в ML thread Davide Libenzi предлагает использовать timerfd (timerfd_create, timerfd_settime) в не древних Linux.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...