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

shell: race condition in assigning global variable

我正在编写一个脚本:

#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 agetopt 命令并解析 bc 的参数。这在很大程度上得到了简化。

当我最后再次调用 function bfunction cfunction b 作为后台进程时,我担心在分配 exported var1 variable 时可能会出现竞争条件到局部变量。

  1. 如果我可以保证对 function bfunction c 的调用将作为后台进程,我是否需要担心这里的竞争条件?

  2. 如果没有竞争,我可以通过不声明每个函数的局部变量来逃脱吗?

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

#!/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