我必须实现用户级线程库。我的问题是睡眠功能。
唤醒使用ualarm函数生成的SIGALRM信号睡眠的线程。 当多个线程设置为以不同的休眠时间进入休眠状态时,如何识别定时器何时触发哪个线程必须从休眠队列中删除.... 如何区分不同线程的报警信号??
答案 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
。