BASH - 使用相同变量的多个线程

时间:2013-02-15 10:07:21

标签: bash shell parallel-processing synchronization

让我们假设以下情况:

function add_to_list
{
    thelist="$thelist $$"
}

for i in $(seq 1 100); do
    add_to_list&
done

wait
echo "The list: $thelist"

这显然不能正常工作,因为线程正在访问相同的变量 - 应该如何正确地完成

3 个答案:

答案 0 :(得分:2)

Bash不支持线程。只有子流程。并且无法在子流程中更改父流程的变量。

答案 1 :(得分:2)

您可以使用处理并发更新的共享存储,例如数据库。

以下是基于sqlite3的示例:

function create_table
{
  sqlite3 thelist <<-%
  drop table t;
  create table t(one varchar(255));
  %
}

function add_to_list
{
  sqlite3 thelist <<-%
  .timeout 60000
  insert into t values('$$');
  %
}

function dump_list
{
  sqlite3 thelist <<-%
  select * from t;
  %
}

create_table
for i in $(seq 1 100); do
    add_to_list&
done

wait
thelist="$(dump_list)"
echo "The list: $thelist"

答案 2 :(得分:1)

在我看来,你正在混淆线程和子处理语义,尤其是想要更新变量。

您可以使用命名管道来在进程之间进行通信。

 $ mkfifo mypipe 


 $ cat < mypipe


 $ seq 1 10 > mypipe

这使cat打印序列。

bash-3.2$ cat always.sh

while : ; do
    cat < mypipe
done

bash-3.2$ seq 1 100  > mypipe & seq 100 200  > mypipe & seq 200 300 > mypipe & 

按顺序从always.sh 1到300创建。

我不确定是否可以安全地同步写入同一命名管道的多个进程。