在UNIX系统上调用sleep(0)有什么影响?

Joh*_*0te 8 c++ unix

我看到人们在我使用的大量多线程,多进程应用程序系统的某些部分执行此操作.它似乎围绕调试行完成:

std::cerr << "DEBUG: Reaching: " << __FUNCTION__ << " @ " << __LINE__ << std::endl;
sleep(0);
Run Code Online (Sandbox Code Playgroud)

如果我宏睡了(​​0); (即将其更改为""),系统的调试输出似乎有不同的顺序(不太可预测),所以我认为它使得线路更快出来 - 但我认为std :: cerr是无缓冲的,并且std: :无论如何,endl调用std :: flush(),为什么会这样呢?

Cha*_*tin 13

基本上,它可以将控制权交还给调度程序,并让您立即重新安排.也就是说,尝试欺骗操作系统做某事基本上是一种破解.

愚弄操作系统绝不是一个好主意.

如果系统适当地欠载,那么进入休眠状态将意味着操作系统获得控制并让I/O队列刷新,因此它会产生这种效果.有时.根据.

究竟它正在做什么取决于实施的细节,坦白地说,你不能依赖它.


bdo*_*lan 8

它以难以预测的方式扰乱调度程序.

通常情况下,结果类似于调用pthread_yield()- 您放弃时间片.这样做的结果是,在大量的调试打印负载下,你在写入cerr(即,在那些<<s 之间)中被抢占的可能性较小,因为你将在一个时间片之后开始.最后一次调试打印,因此你不太可能让多个线程覆盖彼此的输出(即获得类似的东西DEBUG: REACHING: foo() @ DEBUG: REACHING bar()17 @ 24).

也就是说,这种方法不可靠 - 它扰乱了调度程序,而不是要求特定的语义.它也很慢 - 无条件地进入内核以产生(并且可能过于频繁地在多个线程之间弹跳控制).并且它不太可能在多核CPU上正常工作.

将mutex放在所有调试输出上会更好.也就是说,由于这是调试代码,因此作者可能使用快速而肮脏的黑客来使其工作得足以调试他们遇到的任何问题也就不足为奇了.