Bash有线程收益吗?

时间:2015-05-22 20:08:26

标签: multithreading bash

线程产量向操作系统表明该进程暂时不需要CPU,并且调度程序应该抢先切换到另一个进程。例如,在C ++ 11中,调用是std::this_thread::yield()

Bash有这样的命令吗?如果是这样,它是什么?

2 个答案:

答案 0 :(得分:2)

Yielding不是要向系统提供有关流程/线程期望的建议。操作系统不需要这样的帮助,因为它可以在任何给定时间看到过程实际需要什么。相反,即使该线程 还有更多的工作要做,但是屈服是一个主动让其他人有机会运行的线程。即使没有这些帮助,调度程序也非常擅长分配CPU资源。

在任何情况下,不,bash没有这样的内容,您可以通过阅读手册的list of internal commands及其list of built-ins来查看。

然而,人们似乎对bash本身(或任何其他shell)和外部命令之间的混淆感到困惑。外部命令绝不是shell的一部分,但有些是shell编程的备用(grepawksed是第一个想到的。您可以获取或编写的任何程序,但是,您可以通过bash运行。特别是,您可以为该作业构建此C程序:

#include <sched.h>
int main() {
    sched_yield();
    return 0;
}

如果从shell启动它,那么当父shell等待它完成时它确实会产生CPU。 shell本身不会产生,但由于它将在子项完成时被阻塞,因此效果仍然是主动允许其他进程运行。但涉及到令人难以置信的开销!

最后,@ CharlesDuffy的评论非常简洁地阐述了这一情况:

  

合理编写的bash代码将花费时间阻塞(在IO [或]上等待子进程退出),其中任何一个都会隐式产生CPU。

如果您的bash脚本似乎真正用于明确的yield,那么您做错了。

答案 1 :(得分:0)

在bash(或任何程序中),你可以通过调用sleep 0来屈服。在大多数情况下,这将调用内核的调度程序来重新评估下一个应该运行的进程。在一些常见的扩展版本中,您甚至可以使用浮点数调用sleep以获得常规的亚秒级睡眠时间。