从实际的情况看,当sigev_notify设置为SIGEV_SIGNAL时,当定时器超时就会唤醒调用timer_create创建定时器的线程,若该线程刚好在wait,就会出现前面分析的wait返回的情况。如果sigev_notify设置为SIGEV_THREAD,则在定时器超时后,只会唤醒专门创建的定时器处理函数线程,而不会唤醒调用timer_create创建定时器的线程,就不会存在前面分析的wait返回的情况。
五、总结
从分析看,虽然c库代码处理不够严谨,但问题的根源还是timer_create使用不当引起的。在使用timer_create时,不建议把sigev_notify设置为SIGEV_SIGNAL,除非能明确该线程只是进行定时器超时的处理。
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx