只是好奇,Sleep() 函数(在 windows.h 中声明)实际上是如何工作的?也许不仅限于该实现,可以是任何一个。我的意思是 - 它是如何实现的?它如何能够让代码“停止”一段时间?还好奇 cin >> 等函数是如何工作的。它们到底做了些什么?
我所知道的唯一一种阻止某些代码继续运行的方法是使用 while 循环,但考虑到当您调用从 stdin 读取数据的方法时所发生的情况(只需比较 while(true) 和从 stdin 读取数据的处理能力即可),我猜测它们并不是这样工作的。
只是好奇,Sleep() 函数(在 windows.h 中声明)实际上是如何工作的?也许不仅限于该实现,可以是任何一个。我的意思是 - 它是如何实现的?它如何能够让代码“停止”一段时间?还好奇 cin >> 等函数是如何工作的。它们到底做了些什么?
我所知道的唯一一种阻止某些代码继续运行的方法是使用 while 循环,但考虑到当您调用从 stdin 读取数据的方法时所发生的情况(只需比较 while(true) 和从 stdin 读取数据的处理能力即可),我猜测它们并不是这样工作的。
Sleep()
可能会发出一个系统调用,告诉内核“不要让我使用处理器 x 毫秒”。'cin'使用了大量的重载运算符。'>>'通常是右位移,但在C++中,它被重载为几乎每种类型的右操作数。为每个类型提供了一个单独的函数,它从控制台读取并将输入转换为您给定的变量类型。例如:
std::cin::operator>> (int &rhs);
这不是真正的C++ - 我已经有一段时间没有使用流和重载了,所以我不记得返回类型或参数的确切顺序。尽管如此,当您运行cin >>整数变量时,将调用此函数。
确切的底层实现取决于操作系统。
在低级别上,系统有一个名为“调度程序”的例程,将所有正在运行的程序的指令分派到实际运行它们的CPU(s)。像“Sleep”和“usleep”这样的系统调用匹配到告诉调度程序忽略该线程或进程一定时间的指令。
至于C++流,"cin"隐藏了实际的文件句柄(stdin和stdout实际上就是这样的句柄),而">>"操作符则隐藏了底层的读写调用。由于它是一个接口,所以实现可能是特定于操作系统的,但从概念上讲,它仍然在幕后执行类似printf和scanf的操作。