Привет, аналитеги!
Вот tailgunner сказал мне, что мой профайлер, раз не поддерживает работу с тредами, то он не такой супер-пупер крутой. Работает он установкой обработчика сигнала SIGPROF, который приходит от таймера.
Суть вопроса:
Прочитал где-то в интернете, что если в процессе много нитей, и какой-то сигнал (не SIGKILL) разблогирован в каждом из них, то ОС передает его одному (произвольному) треду. Мне же надо при получении сигнала от таймера остановить каждый тред и покопаться в его контексте. Как это сделать?
Мои идеи (если вы знаете наверняка, как ответить на мой вопрос, то лучше и не читать):
У меня на уме только один вариант, в котором сигнал будет получать главный тред, потом он каким-то образом приостановит остальные и соберет с них инфу. Как остановить несколько тредов сразу в один момент?
Может годится такой вариант: главный тред получает SIGPROF (в остальных тредах он заблокирован). Обработчик из главного треда посылает каждому созданному треду (их можно хранить в списке) с помощью pthread_kill SIGUSR1, в этом треде он ловится и производятся необходимые действия.
/->[Thread 1] --> Handler
/
------------ / SIGUSR1
SIGPROF / \/
----------->/ Main thread \
\ /
\ /\
------------ \SIGUSR1
\
\->[Thread 2] -> Handler
Дискач. Позову спеца mashina