shell:分配全局变量时的竞争条件

时间:2018-09-27 22:01:58

标签: bash shell sh race-condition

我正在编写一个脚本:

#script_1.sh
function a() {
    export var1='...some calculations on $@...';
}

function b() {
    a "$@"
    local loc_b=$var1
}

function c() {
    a "$@"
    local loc_c=$var1
}

#script_2.sh
source script_1.sh
b val1 &
c val2 &
b val2 &

function a具有getopt命令并解析bc的参数。这已经大大简化了。

当我作为后台进程在最后再次调用function bfunction cfunction b时,我担心将exported var1 variable分配给局部变量。

  1. 如果我可以保证对function bfunction c的调用将作为后台进程,那么我是否需要担心此处的竞争状况?

  2. 如果没有种族,我可以不声明每个函数的局部变量而逃脱吗?

1 个答案:

答案 0 :(得分:3)

每个后台进程都有自己的环境副本。子进程不能更改其父进程的环境。因此,没有竞争条件:如果在运行后台进程之前更改了全局变量,则该进程将复制新值。如果您在更改值之前运行后台进程,则该进程将看到旧值。

#!/bin/bash

global=1

inc () {
    ((++global))
    echo inc: $global
}

dec () {
    ((--global))
    echo dec: $global
}

inc & dec &
# 2   0

global=10
inc & dec & inc & dec &
# 11  9     11    9