Linux Bash中的多线程

Linux Bash中的多线程,linux,multithreading,bash,shell,Linux,Multithreading,Bash,Shell,我想在我的shell脚本中介绍多线程功能 我有一个脚本,它使用不同的参数调用函数read\u cfg()。 每个函数调用都是独立的 是否可以并行实例化这些函数调用(而不是脚本)。 请告诉我,我们如何才能做到这一点 当然,只需在命令后添加&: read_cfg cfgA & read_cfg cfgB & read_cfg cfgC & wait 所有这些作业将同时在后台运行。然后,可选的wait命令将等待所有作业完成 每个命令都将在一个单独的进程中运行,因此从技术上讲它

我想在我的shell脚本中介绍多线程功能

我有一个脚本,它使用不同的参数调用函数
read\u cfg()
。 每个函数调用都是独立的

是否可以并行实例化这些函数调用(而不是脚本)。
请告诉我,我们如何才能做到这一点

当然,只需在命令后添加
&

read_cfg cfgA &
read_cfg cfgB &
read_cfg cfgC &
wait
所有这些作业将同时在后台运行。然后,可选的
wait
命令将等待所有作业完成


每个命令都将在一个单独的进程中运行,因此从技术上讲它不是“多线程”,但我相信它解决了您的问题。

Bash作业控制涉及多个进程,而不是多个线程

您可以在后台执行带有
&
后缀的命令

您可以使用
wait
命令等待后台命令完成


通过使用
|
将多个命令分隔开来,可以并行执行多个命令。这还提供了一种同步机制,因为
|
左侧命令的stdout连接到右侧命令的stdin。

您可以并行运行脚本的多个副本,每个副本用于不同的输入数据,例如处理4个核心上的所有*.cfg文件:

    ls *.cfg | xargs -P 4 -n 1 read_cfg.sh

read_cfg.sh脚本只接受一个参数(由-n强制执行)

您应该读取进程和线程之间的差异。您所建议的不是多线程,而是每个命令都有单独的进程。@TomTom:我当然知道进程和线程之间的区别。如果你看穿了OP的措辞,我相信他只是在问是否有可能并行运行这些命令(这是可能的)。为了澄清这一点,我添加了一个注释。如果你有大量的进程,可能会很慢。只是一个注释,你应该指定
read_cfg.sh
xargs
的完整路径,它会说找不到该文件。最好使用
printf“%s\0”*.cfg | xargs-0…
——这样可以处理带有空格的文件名,不可打印字符等。另请参见。这不是多线程处理,而是多处理。每个实例都在一个不同的进程中运行,使用
fork()
从原始进程复制。与线程不同,这些进程有自己的文件描述符表,它们的内存是写时复制的(因此,当它们更改变量的值时,父进程看不到它)。