It looks that in principle it is not allowed to call
timer_delete, at least on Linux. signal(7) is only allowing async-signal-safe functions to be called directly or indirectly from a signal handler, and strangely
timer_delete is not listed amongst them (perhaps it is a typo and they both should be listed as async-signal-safe, since both timer_create(2) & timer_delete(2) are in section 2 of the man pages, and appear in syscalls(2))
Notice that POSIX signal concepts page does not list
timer_create as possible in a signal handler. I imagine that on some operating systems these timer functions might be implemented entirely in the C library (not in the kernel).
My guess (since
timer_delete is a syscall on Linux listed in
<asm/unistd.h>) is that
timer_delete are in fact async-signal-safe so can be called from a Linux signal handler. This might be false on other POSIX implementations.