代码之家  ›  专栏  ›  技术社区  ›  bdhar

睡眠的意义(0)

  •  43
  • bdhar  · 技术社区  · 16 年前

    我以前经常看到 Sleep(0) 在我的代码的某些部分 while 回路可用。我被告知它将使时间片可用于其他等待进程。这是真的吗?对我来说有什么意义吗 ?

    8 回复  |  直到 12 年前
        1
  •  54
  •   Nick Meyer    16 年前

    根据MSDN的文档 Sleep :

    值为零会导致线程 放弃剩下的时间 切片到任何其他 线程准备运行,函数 立即返回,线程

    需要认识到的重要一点是,这给了其他线程一个运行的机会,但是如果没有线程可以运行,那么您的线程将继续运行--使CPU使用率保持在100% 某物

        2
  •  17
  •   Sjoerd    16 年前

    是的,它给了其他线程运行的机会。

    值为零会导致线程 放弃剩下的时间 切片到任何其他 准备好跑步了。如果没有别的 线程准备运行,函数 继续执行。

    Source

        3
  •  14
  •   Steve Townsend    16 年前

    恐怕我不能在这方面提高 MSDN docs

    放弃剩下的时间 切片到任何其他 准备好跑步了。如果没有别的 继续执行。

    使线程放弃 它的剩余时间片 准备好跑步了。如果没有别的 具有相同优先级的线程已准备就绪 线程继续执行。 这种行为从 Windows Server 2003。

        4
  •  14
  •   Alex F    16 年前

    请注意Sleep(0),如果一个循环的迭代执行时间很短,那么这可能会显著降低此类循环的速度。如果这对使用它很重要,您可以调用Sleep(0),例如,每100次迭代调用一次。

        5
  •  3
  •   fduff    12 年前

    Sleep(0); 在该指令下,系统调度器将检查任何其他可运行线程,并可能根据线程优先级为它们提供使用系统资源的机会。

    在Linux上有一个特定的命令: sched_yield() 从手册页:

    使调用线程放弃CPU。这个 线程被移动到队列的末尾以获得其静态优先级和 新线程开始运行。

    如果调用线程是最高优先级列表中唯一的线程 计划产量() .

    还有

    可以通过给予 计划产量() 其他可调度线程所需的资源仍由 调用方),因为这样做会导致不必要的上下文切换, 这会降低系统性能。

        6
  •  2
  •   norm    12 年前

    在一个应用程序中……主线程寻找要做的事情,然后通过一个新线程启动“工作”。在这种情况下,您应该在主线程中调用sched\u yield()(或sleep(0)),这样,您就不会让“寻找”工作比“工作”更重要。我更喜欢睡眠(0),但有时这是过度的(因为你睡了几分之一秒)。

        7
  •  1
  •   Community Mohan Dere    9 年前

    Sleep(0)是一个强大的工具,它可以在某些情况下提高性能。在特殊情况下,可以考虑在快速循环中使用它。当一组线程应具有最大的响应性时,它们都应经常使用Sleep(0)。但在代码的上下文中,找到一个规则来解释responsive的含义是至关重要的。

    我在书中已经讲了一些细节 https://stackoverflow.com/a/11456112/1504523

        8
  •  0
  •   Nick Sotiros    12 年前

    我正在使用pthreads,由于某种原因,在我的mac上,编译器找不到要声明的pthread\u yield()。但似乎睡眠(0)是一样的。