如何在 C(不是 C++)中实现 Javascript 的 setTimeout() 函数

How to implement Javascript's setTimeout() function in C (not C++)

标题说明了一切。 我见过 C++ 中的解决方案。例如, 和一些(也包括 C++)相当古老。 我愿意使用 glib 或任何其他开源库。我只关心 Linux 实现。

我遇到了 glib 的 timer functions,但它们本质上都是同步的,并且与 setTimeout() 的作用不接近。

我可以想到一种解决方案,即拥有一个单独的线程,该线程在循环中不断检查计时器(例如 Glib 提供的计时器)是否已过期,然后触发相应的函数。当然,那样效率低得离谱。

我也遇到了这个 here,它建议使用 alarm(2)。它可以使用,但粒度仅以秒为单位。

编辑:唉 alarm() 取消了任何之前设置的 alarm()

您提到您的进程中需要多个计时器,因此您可能需要 POSIX timer_* 系列函数(timer_createtimer_settime 等).它们具有纳秒粒度。您可以为计时器到期时指定几个不同的操作:发出信号或从单独的线程调用函数。您必须 link 和 -lrt 才能使用这些功能。

还有 timerfd_create,它允许您使用 pollselect 或它们的亲戚通过文件变得可读来检测计时器过期。

如果您想在主循环回调中使用 GLib 及其超时源 (g_timeout_add(), g_timeout_add_seconds(), etc.), then you will need to run a GLib main loop (GMainLoop) 和 运行 应用程序的其余部分。如果您的应用程序尚未以事件驱动的风格编写,这将是一个相当大的变化,但对于轮询套接字或 运行 宁 UI 无论如何都是必需的。

有一个如何在应用程序中使用超时源的示例

请注意,GLib 的计时器 API (g_timer_*()) 不是用于 运行 特定超时后的回调,而是用于计时某事需要多长时间(如秒表)。与这里无关。