Search code examples
multithreadingthread-sleep

How to differentiate alarm signal of different threads?


I got to implement user level thread library. My problem is with sleep function.

am waking a thread which was slept using SIGALRM signal generated by ualarm function. when multiple threads were set to sleep with different sleep times how can I identify when the timer fires which thread must I remove from sleep queue....?? How to differentiate alarm signal of different threads??


Solution

  • The signal handler is called from the context of the target thread. Hence, thread-specific storage works as expected (I tested it on Linux and Solaris). From the signal handler use the unix self-pipe trick to communicate from the signal handler back to the thread:

    __thread int signal_pipe; // The write end.
    
    extern "C" void signal_handler(int signo, siginfo_t*, void*)
    {
        if(!signal_pipe) // programming error: signal is being delivered to a wrong thread.
            abort();
        unsigned char signo_byte = static_cast<unsigned>(signo);
        // standard unix self pipe trick
        write(signal_pipe, &signo_byte, 1);
    }
    

    Each thread using this signal handler must create its own pipe and initialize signal_pipe with the write end of that pipe.