任何人都可以提供有关librt.so.1的timer_helper_thread()函数的一些信息
我在我的应用程序中使用posix timer_create()函数进行计时器功能,我使用SIEV_THREAD进行通知。当超时发生时,我可以在gdb中看到正在创建两个线程。一个是我已指定启动函数的线程,另一个是启动函数为librt.so.1的timer_help_therad()的线程。在这两个中,即使在我的线程退出后,timer_helper_thread()也没有退出。有人可以告诉我,timer_helper_thread()何时退出并提供一些信息?
答案 0 :(得分:0)
简短回答:不要担心;它是一个实现细节,当程序退出时会自动清理。但如果你很好奇......
来自glibc的timer_create(2)
手册页:
SIGEV_THREAD: 在计时器到期时,调用sigev_notify_function,就好像它是新线程的启动函数一样。 (这里的实现可能性包括每个计时器通知可能导致创建新线程,或者创建单个线程以接收所有通知。)
还有:
SIGEV_THREAD的功能是在glibc中实现的,而不是内核。
所以glibc(即librt.so)假设内核无法创建一个响应计时器事件的线程 - 它所支持的只是发送一个信号。所以有人需要接收该信号并创建处理程序线程。如果你想知道自己接收信号的细节,你就不会使用SIGEV_THREAD,所以glibc不会打扰你,而只是为了处理定时器事件而创建自己的线程。
此计时器帮助程序线程从您第timer_create()
次调用到程序结束时为止。除非你做一些不寻常的事情,否则你不必担心它;当你的程序退出时它会自动清理。它唯一能做的就是等待计时器到期,因此它不会消耗任何额外的处理能力。此外,无论您创建多少计时器,看起来只会有一个辅助线程。
答案 1 :(得分:0)
@jander:你的评论很有意思“这个计时器助手线程从第一次调用timer_create()开始持续到你的程序结束。” 每次定时器超时时都会创建线程。这与你提到的timer_helper_thread()相同吗? 我有一个类似的帖子,我观察一个仅为timer_create()创建的单独线程。这是timer_helper_thread()吗? 参考:New thread on invocation of timer_create()