如果你运行几个线程,但它们都必须打印到同一个标准输出,这是否意味着它们必须互相等待?所以说如果所有4个线程都有东西要写,他们必须暂停并等待stdout免费,以便他们继续他们的工作?
答案 0 :(得分:3)
在操作系统的系统调用深层深度(深深深入...),是的。现代操作系统具有线程安全的终端打印例程,通常只能锁定执行实际设备访问的关键部分(或缓冲区,具体取决于您要写入的内容及其设置)。然而,这些等待时间很短。请记住,这是您在此处理的IO,因此相对于实际的IO执行,等待时间可能可以忽略不计。
答案 1 :(得分:0)
这取决于。如果stdout是一个管道,每个管道都有一个4KB的缓冲区,你可以在创建管道时覆盖它。缓冲区已满或调用flush()
时刷新缓冲区。
如果stdout是终端,则输出通常是行缓冲的。因此,在打印换行符之前,所有线程都可以写入缓冲区。当写入换行符时,整个缓冲区被转储到控制台上,同时写入换行符的所有其他线程必须等待。
由于线程除了编写换行符之外还执行其他操作,因此每个线程都会获得一些CPU。因此,即使在最坏的情况下,拥堵也应该非常小。
但有一个例外:如果您编写了大量数据或者控制台速度很慢(例如使用串行端口的Linux内核调试控制台)。当控制台无法处理大量数据时,越来越多的线程将在写入换行符时挂起,等待缓冲区刷新。