如何区分不同线程的报警信号?

时间:2014-09-09 10:20:23

标签: multithreading thread-sleep

我必须实现用户级线程库。我的问题是睡眠功能。

唤醒使用ualarm函数生成的SIGALRM信号睡眠的线程。 当多个线程设置为以不同的休眠时间进入休眠状态时,如何识别定时器何时触发哪个线程必须从休眠队列中删除.... 如何区分不同线程的报警信号??

1 个答案:

答案 0 :(得分:0)

从目标线程的上下文中调用信号处理程序。因此,特定于线程的存储按预期工作(我在Linux和Solaris上测试过)。从信号处理程序使用the unix self-pipe技巧从信号处理程序返回到线程:

__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);
}

使用此信号处理程序的每个线程都必须创建自己的管道,并使用该管道的写入端初始化signal_pipe