【问题标题】:To sleep in C, should I use while with a clock, or a system call?要在 C 中休眠,我应该使用带时钟还是系统调用的 while?
【发布时间】:2012-05-30 16:25:16
【问题描述】:

我正在查看clock() on cplusplus.com。他们的例子包括让进程等待一秒钟然后输出一行,循环直到 10 秒过去。我需要在我正在处理的家庭作业中做类似的事情。我想知道的是:如果我只是将我的程序发送到一个循环中,那不就是使用系统资源来让我旋转吗?在这种情况下,系统调用不是更好吗?

感谢您的帮助!

【问题讨论】:

标签: c sleep system-calls


【解决方案1】:

是的,使用像sleep() 这样的系统调用或库函数要好得多。 clock() 示例只是为了展示如何正确调用函数并解释其返回值,而不是说明让程序等待的最佳方法。

【讨论】:

  • 我就是这么想的。所以我正在做 system("sleep 2") 例如。这很酷吗?
  • 啊,不要那样做。不要为了睡眠两秒钟而启动整个 shell。
  • @Ziggy,不,那更糟。在任何 Unix/Linux 系统上,<unistd.h> 中都定义了一个 sleep(unsigned int seconds) 函数。在 Windows 上,有 Sleep(DWORD dwMilliseconds)
  • 从不使用system。最好的情况是大量浪费资源,最坏的情况是(并且通常)会在您的程序中引入重大的危险错误。
  • 是的,但仅供参考,在这种情况下,clock() 值是如何计算的?
【解决方案2】:

这是一个奇怪的例子。我知道这只是一个例子,但是......

要睡觉,请致电sleep(unsigned int)

还有其他调用(nanosleep 在 unix-y 机器上)进行亚秒级睡眠。如果你是老派,你可以随时使用select()

请注意,所有这些都可能被中断,因此如果由于某种原因它们提前返回,您可能需要循环。

【讨论】:

  • 你包含什么头文件来获得睡眠功能? unistd.h?
  • 是的。在(大多数)unix-y 机器上,只需执行man 3 sleep,它就会显示您需要包含的内容。
【解决方案3】:

我必须补充一点,sleep() 只会让当前线程进入睡眠状态,而不是整个程序,如果它是多线程的。

【讨论】:

  • 好点。没有什么可以让所有线程休眠,是吗?
  • 从未听说过。为什么要产生线程并让它们同时全部休眠? :) 这样的操作仅在进程之外是合理的,并且有各种操作系统工具(即 UNIX 信号)服务于该目的。
  • 如果我真的用力眯起眼睛,我可以想出一个难以置信的用例。我只是问,因为在阅读您的评论之前我从未真正想到过。
【解决方案4】:

为了清楚起见,您不应该做类似示例的事情。如果这样做,您的程序将在等待时消耗其中一个内核上 100% 的 CPU。最好使用sleepselect 之类的东西。

【讨论】:

    【解决方案5】:

    如果你的程序是多线程的,那么最好使用sleep()。原因是clock() 需要额外的编码,而使用sleep() 你可以用更少的内存和更少的时间完成你的任务...@ 987654324@会涉及CPU很多...

    【讨论】:

      猜你喜欢
      • 2020-04-07
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 2020-01-15
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多