Описание ошибки от 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(