每次都需要调用timer_delete来删除定时器吗?

我在下面的代码中使用了timer_create() 。 它会在10秒后触发处理程序一次。

 struct itimerspec itimer = { { 0, 0 }, { 10, 0 } }; struct sigevent si; memset (&si, 0, sizeof (struct sigevent)); si.sigev_notify = SIGEV_THREAD; si.sigev_notify_attributes = NULL; si.sigev_notify_function = t; if (timer_create (CLOCK_REALTIME, &si, &timer) < 0) { fprintf (stderr, "[%d]: %s\n", __LINE__, strerror (errno)); exit (errno); } if (timer_settime (timer, 0, &itimer, NULL) < 0) { fprintf (stderr, "[%d]: %s\n", __LINE__, strerror (errno)); exit (errno); } 

我的问题是,10秒后我的处理程序被触发 – 现在我必须在退出进程之前使用timer_delete()删除计时器吗? 或者,因为它只触发一次,是否没有必要明确地删除它?

Solutions Collecting From Web of "每次都需要调用timer_delete来删除定时器吗?"

是的,你需要明确的删除定时器。

看看timer_create的man(2)页面 。 在注释部分(特别是第三个注释)中,您将看到每次调用timer_create使用内核中的资源,并且内核一次可以分配的所有进程中的计时器总数是有限的。

如果你不删除你的定时器,你将最终用完它们, 任何需要分配定时器的应用程序都可能失败。

这就像内存泄漏一样 – 清理你使用的资源,否则你最终会耗尽。

回复您的后续问题
在下面的评论中,你问timer_delete在你的回调函数中调用timer_delete是否可以。 我不确定如何回应,所以我自己开了个问题 。 答案似乎是可能的 。 你可以尝试尝试一下,看看它是否有效,但我会建议反对它。 我从来没有见过任何从回调中删除定时器的代码,在事件处理完成之前释放定时器资源的想法让我感到紧张。

此外,测试它可能会产生好的结果,但有随机失败,因为你正在处理异步事件。 此外,主程序需要运行,直到回调完成(它们运行在相同的进程中,只是不同的线程),所以你可以在退出之前删除主线程中的定时器。 我认为这是更安全的解决方案,并且将更容易调试。