Описание ошибки от 19.12.2005. Интервальный таймер неправильно работает на системах с NPTL
Сформировалось подозрение на багу в работе интервального таймера и сигналов в NPTL на ядрах >= 2.6.12.
Проблема в следующем:
- имеется задача в которой создаётся множество потоков;
- каждый поток создаёт собственный интервальный таймер с индивидуальным периодом с помощью функций: setitimer() или timer_create();
- обработчик сигналов для всех это функция пустышка указанная с помощью: signal();
- каждый поток циклически выполняет свой код с ожиданием сигнала после этого с помощью функций: sigwait() или pause();
- на системах без NPTL и на системах с NPTL на ядрах 2.4 (ALTLinux2.4, ASPLinux9) сигналы шлются потокам и они периодически выполняют свой код;
- на системах с NPTL и ядрами >= 2.6.12 (SuSE10_64, Mandriva2006, FedoreCore4_64) сигналы шлются процессу, но не потокам, в результате чего потоки стоят на ожидании сигнала;
Для примера написана тестовая программа которая воспроизводит эту проблему. На системах без NPTL и на системах с NPTL на ядрах 2.4 (ALTLinux2.4, ASPLinux9) результаты её работы такие:
ALTLinux2.4
На системах с NPTL и ядрами >= 2.6.12 (SuSE10_64, Mandriva2006, FedoreCore4_64) результаты её работы такие:
SuSE 10 (64)
Из протокола выполнения программы на SuSE10 видно что:
- цикл потока один раз выполняется и стопорится на ожидании сигнала функцией sigwait(&set, &sig);
- при этом сигналы идут, но на процесс, что видно по сообщениям "Exit from programm!" возникающих после функции sleep(30) с частотой 1 сек путём прерывания функции sleep(30) сигналом.
Проблему выявлено на дистрибутивай:
- SuSE 10 (64)
- Mandriva 2006
- FedoreCore4 (64)
На всех этих дистрибутивах используется: kernel >=2.6.12, glibc 2.3.5, gcc 4.0, NPTL
Не выявлено на дистрибутивах:
Похоже на проблему в особенности реализации интервального таймера на NPTL. В связи с которой становится невозможным получить интервалы в потоках для задач такого типа. В связи с этим, для данных задач, рассматривается вариант использования возможности таймера создавать поток по истечению времени.
Исходники тестовой программы