睡眠()vs sleep_for()

时间:2018-03-02 14:36:00

标签: c++ multithreading sleep thread-sleep

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

Name

我在多线程行为术语中注释,而不是系统兼容性。

2 个答案:

答案 0 :(得分:3)

不同之处在于sleep_for()由C ++ 11标准定义,Sleep()由Windows API定义。如果使用sleep_for(),很可能(尽管不确定)编译器会在编译W​​indows时生成调用Sleep()的代码。但是,由于它是一个C ++ 11标准函数,这意味着任何编译器(正确地)实现C ++ 11标准都会有一些方法来为任何平台生成function所描述的功能的代码。支持。

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

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

答案 1 :(得分:0)

当您调用类似下面的睡眠方法时,它会指示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将唤醒休眠线程并将处理器重新分配给它以便进一步执行和操作。