LINUX.ORG.RU

Быстро ли доходят сигналы до тредов?


0

0

Я посылаю сигнал одному треду из другого посредством pthread_kill. Можно ли ожидать, что второй тред уже будет находиться в обработчике этого сигнала (если обработчик есть, или, по крайней мере, прекратит исполненеие своего кода к тому времени, когда первый тред выйдет из pthread_kill?

anonymous

Для Linux 2.4+/IA32 для kill это насколько я помню именно так (если нить не висит на процессоре, то ей выставляется sigpending флаг, если висит, то тому процессору отправляется IPI), на не-IA32 могут быть нюансы с IPI.

Если реализация pthread_kill вызывает kill/tkill напрямую для нужной нити, то наверное всё будет так ;)

Murr ★★
()

Нет, этого ожидать не стоит :)

Получателю сигнала ставится TIF_SIGPENDING. Если он
не в TASK_RUNNING (спит), будим его и на этом все.
(Он может быть в TASK_UNINTERRUPTIBLE, и тогда пробуждение
не сработает).

Если он TASK_RUNNING, и в данный момент _исполняется_
на другом CPU (он может просто сидеть там в очереди),
вызываем smp_send_reschedule(CPU). Для i386 действительно
посылается IPI, для других архитектур может быть и не так,
но без нюансов.

В любом случае kill/tkill возвращается, и совершенно
неизвестно, когда получатель сигнала получит CPU
для исполнения обработчика сигнала.

idle ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.