Sleep() vs sleep_for()

Sleep() vs sleep_for()

本文关键字:for vs Sleep sleep      更新时间:2023-10-16

有人可以解释这两种停止线程然后再次继续的方式之间的行为差异吗?

Sleep(); //from Win32
std::this_thread::sleep_for();

我评论的是多线程行为,而不是系统兼容性。

区别在于sleep_for()由 C++11 标准定义,而Sleep()由 Windows API 定义。如果使用sleep_for(),则编译器很可能会(尽管不确定)生成在针对 Windows 进行编译时调用Sleep()的代码。但是,由于它是一个 C++11 标准函数,这意味着任何(正确)实现 C++11 标准的编译器都将有某种方式为其支持的任何平台生成函数所描述的功能的代码。

另一个主要区别是sleep_for()std::chrono::duration作为参数,而不是以毫秒为单位的整数。这使您可以更轻松、更精确地指定希望线程休眠的时间。它还会将一些文档信息移动到类型系统中。

您想知道sleep_for()Sleep()对多线程的影响,我只能说sleep_for()具有 C++11 标准中定义的含义,而Sleep()具有 Windows API 中定义的含义。如果您检查引用,每个都会谈论各自的线程类型。因此,如果您使用的是 C++11 线程,请使用sleep_for().如果直接使用 Win32 线程,请使用Sleep()Sleep()没有任何 C++11 线程的概念,因此没有明确定义的行为。同样,sleep_for()没有Windows API线程的概念,因此也没有明确定义的行为。每个函数的文档指定了其与各自线程的交互。不要混合标准。

当您调用如下所示的睡眠方法时,它会指示 O/S 暂停作为参数提供给 sleep() 函数/方法的特定时间片的线程。一旦此函数执行 O/S 会暂时停止该线程并进入睡眠状态。通过这样做,O/S 还会从中释放微处理器(从休眠线程),以便可以将处理器分配给正在等待处理器时间的另一个线程或进程。两者之间没有任何重大区别。Sleep()适用于Windows,您必须添加Windows头文件<windows>和下一个,您可以在Windows和Unix环境中使用,并且需要使用头文件<chrono>

Sleep(); //from Win32
std::this_thread::sleep_for();

您可以使用以下两种睡眠功能:-

Sleep(100); //sleep for 100 m/s but only in windows    
std::this_thread::sleep_for(std::chrono::milliseconds(100));//sleep for 100 m/s. Can be use in both windows and Unix environment

100 m/s 后,O/S 将唤醒休眠线程,并将处理器重新分配给它以进行进一步的执行和操作。