C-printf()是否会使线程休眠?

时间:2018-06-24 21:30:49

标签: c printf

当程序正在执行I / O时,我的理解是线程将短暂睡眠然后恢复(例如,在写入文件时)。我的问题是,当我们使用printf()进行打印时,C程序线程是否以任何方式休眠?

2 个答案:

答案 0 :(得分:0)

由于您已专门要求printf(),因此,我假设您的意思是,以最通用的方式填充一个合理大小的缓冲区并调用{{3} {1}},而stdout恰好指向您的终端。

在大多数操作系统中,当您调用某些系统调用时,调用线程/进程将从CPU可运行列表中删除,并放置在单独的等待列表中。对于所有I / O调用(例如读/写/等)都是如此。由于I / O而暂时从处理中删除与通过计时器进入睡眠状态不同。

例如,在Linux中,线程/进程的不间断睡眠状态专门用于I / O等待,而那些正在等待计时器和事件的线程/进程的不间断睡眠状态。尽管从愚蠢的用户的角度来看,他们似乎都是相同的,但其在幕后的实现却大不相同。

为回答您的问题,对write(2)的调用并不完全处于睡眠状态,而是等待缓冲区刷新到设备而不是实际上处于睡眠状态。即便如此,您仍可以在printf()中阅读到更多有关古怪的知识,甚至可以从signal(7)博客中获取有关各种进程/线程状态的更多信息。

希望这会有所帮助。

答案 1 :(得分:-1)

stdio.h的主要意义在于它 buffers I / O:对printf的调用通常只是将文本放入内存缓冲区(由库拥有)默认情况下)并执行 zero 系统调用,因此没有机会产生CPU。即使调用了write(2) 之类的线程,该线程也可能继续运行:内核可以将数据复制到内核内存中(以后它将从该数据传输到磁盘中,例如 并立即返回。

当然,即使在单核系统上,大多数操作系统也经常中断正在运行的线程以共享它。因此,即使没有进行阻塞调用,另一个线程仍然可以随时运行。