I used 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()
在退出进程之前?或者,既然只触发一次,是不是就不需要显式删除呢?
是的,您需要显式删除计时器。
看看timer_create 的 man(2) 页面 http://man7.org/linux/man-pages/man2/timer_create.2.html。在注释部分(特别是第三个注释),您将看到每次调用timer_create
使用内核中的资源以及定时器总数all内核可以一次性分配的进程是有限的。
如果您不删除计时器,您最终将用完它们并且任何需要分配计时器的应用程序都可能会失败。
这就像内存泄漏一样 - 清理你使用的资源,否则你最终会耗尽。
回复您的后续问题
在下面的评论中,您询问是否可以打电话timer_delete
从你的回调函数内部。我不知道如何回答,所以我打开了我自己对此提出疑问 https://stackoverflow.com/q/29803394/2615940。答案似乎是maybe。您可以尝试尝试一下,看看它是否有效,但我建议不要这样做。我从未见过任何从回调中删除计时器的代码,并且在事件处理完成之前释放计时器资源的想法让我感到紧张。
此外,测试它有时可能会产生良好的结果,但由于您正在处理异步事件,因此会出现随机失败。此外,您的主程序需要运行直到回调完成(它们在同一进程中运行,只是不同的线程),因此您也可以在退出之前删除主线程中的计时器。我认为这是更安全的解决方案,并且更容易调试。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)