Shell:为什么全局数组不能被不同线程中的函数更改

时间:2014-03-07 19:46:28

标签: multithreading shell

    #!/bin/bash
    grand()
    {
     i=$1
     GRAND_TOTAL[$i]=$2
     echo "inside function GRAND_TOTAL[$i]: ${GRAND_TOTAL[$i]}"
    }

    GRAND_TOTAL=(0 0 0 10 0)
    GRAND_TOTAL[2]=23
    echo ${GRAND_TOTAL[2]}
    echo ${GRAND_TOTAL[3]}
    grand 1 100 &
    grand 2 200 &
    wait
    echo "outside function GRAND_TOTAL[1]: ${GRAND_TOTAL[1]}"
    echo "outside function GRAND_TOTAL[2]: ${GRAND_TOTAL[2]}"

结果:     23     10     内部函数GRAND_TOTAL [1]:100     内部函数GRAND_TOTAL [2]:200     外部函数GRAND_TOTAL [1]:0     外部功能GRAND_TOTAL [2]:23

为什么不同线程中的函数不能更改全局数组?但如果按顺序运行它可以改变。

如果我调用该函数按顺序运行

grand 1 100
grand 2 200

结果:

23
10
inside function GRAND_TOTAL[1]: 100
inside function GRAND_TOTAL[2]: 200
outside function GRAND_TOTAL[1]: 100
outside function GRAND_TOTAL[2]: 200

1 个答案:

答案 0 :(得分:1)

后台进程是使用fork()创建的,因此它们拥有自己的所有进程内部内存副本,包括(在本例中)Bash变量。 (有关&导致命令在子shell中运行的语句,请参阅 Bash参考手册§3.2.3 "Lists of Commands";有关子shell的说明,请参阅§3.7.3 "Command Execution Environment"不能影响其父shell的执行环境。)唯一的解决方法是使用某种外部存储,例如命名管道或常规文件。