Я не знаю, какую реализацию вы курите, но в libc эти функции в большинстве случаев просто возвращают постоянную статическую переменную.
Вы правы, возможна гонка между двумя вызовами init (), но это просто просто инициализирует static int дважды для одной и той же константы, вряд ли это беспокоит.
И,в то время как статическая переменная на самом деле не такая постоянная, они говорят вам изменять только указанную переменную в начале вашей программы (и я думаю, что только pthread действительно так сильно ее изменяет).
Так что не нужно беспокоиться об этихфункции (из allocrtsig.c glibc 2.14).
И, если вы действительно обеспокоены, просто вызовите SIGRTMIN один раз, прежде чем связывать обработчик сигнала.Это уберет функцию init ().
/* Return number of available real-time signal with highest priority. */
int __libc_current_sigrtmin (void)
{
#ifdef __SIGRTMIN
if (!initialized)
init ();
#endif
return current_rtmin;
}
libc_hidden_def (__libc_current_sigrtmin)
/* Return number of available real-time signal with lowest priority. */
int __libc_current_sigrtmax (void)
{
#ifdef __SIGRTMIN
if (!initialized)
init ();
#endif
return current_rtmax;
}
libc_hidden_def (__libc_current_sigrtmax)