有人可以解释这两种停止线程的方式之间的行为差异然后再继续吗?
Name
我在多线程行为术语中注释,而不是系统兼容性。
答案 0 :(得分:3)
不同之处在于sleep_for()
由C ++ 11标准定义,Sleep()
由Windows API定义。如果使用sleep_for()
,很可能(尽管不确定)编译器会在编译Windows时生成调用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将唤醒休眠线程并将处理器重新分配给它以便进一步执行和操作。