每次都需要调用timer_delete来删除定时器吗?
Does timer_delete need to be called to delete the timer every time?
我在下面的代码中使用了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()
删除计时器吗?或者,因为它只触发一次,所以不需要显式删除它吗?
是的,您需要明确删除计时器。
看看man(2) page for timer_create。在注释部分(特别是第三个注释),您会看到对 timer_create
的每次调用都使用内核中的资源,以及定时器的总数,跨越 all内核一次可以分配的进程是有限的。
如果您不删除您的计时器,您最终将 运行 删除它们并且 任何需要分配计时器的应用程序都可能会失败。
这就像内存泄漏 - 清理您使用的资源,否则您最终会 运行 出局。
回复您的后续问题
在下面的评论中,您询问是否可以从回调函数内部调用 timer_delete
。我不确定如何回应,所以我打开了 。答案似乎是可能。你可以试着用它做实验,看看它是否有效,但我建议不要这样做。我从未见过任何从回调中删除计时器的代码,在事件处理完成之前释放计时器资源的想法让我很紧张。
此外,测试它有时可能会产生好的结果,但由于您正在处理异步事件,因此会出现随机失败。此外,您的主程序需要 运行ning 直到回调完成(它们 运行 在同一个进程中,只是不同的线程),所以您也可以在主线程之前删除计时器退出。我认为这是更安全的解决方案,并且更容易调试。
我在下面的代码中使用了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()
删除计时器吗?或者,因为它只触发一次,所以不需要显式删除它吗?
是的,您需要明确删除计时器。
看看man(2) page for timer_create。在注释部分(特别是第三个注释),您会看到对 timer_create
的每次调用都使用内核中的资源,以及定时器的总数,跨越 all内核一次可以分配的进程是有限的。
如果您不删除您的计时器,您最终将 运行 删除它们并且 任何需要分配计时器的应用程序都可能会失败。
这就像内存泄漏 - 清理您使用的资源,否则您最终会 运行 出局。
回复您的后续问题
在下面的评论中,您询问是否可以从回调函数内部调用 timer_delete
。我不确定如何回应,所以我打开了
此外,测试它有时可能会产生好的结果,但由于您正在处理异步事件,因此会出现随机失败。此外,您的主程序需要 运行ning 直到回调完成(它们 运行 在同一个进程中,只是不同的线程),所以您也可以在主线程之前删除计时器退出。我认为这是更安全的解决方案,并且更容易调试。