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 a
有 getopt
命令并解析 b
和 c
的参数。这在很大程度上得到了简化。
当我最后再次调用 function b
、function c
和 function b
作为后台进程时,我担心在分配 exported var1 variable
时可能会出现竞争条件到局部变量。
如果我可以保证对 function b
或 function c
的调用将作为后台进程,我是否需要担心这里的竞争条件?
如果没有竞争,我可以通过不声明每个函数的局部变量来逃脱吗?
每个后台进程都有自己的环境副本。子进程不能改变其父进程的环境。因此,不存在竞争条件:如果您在 运行 后台进程之前更改全局变量,该进程将复制新值。如果您在更改值之前 运行 一个后台进程,该进程将看到旧值。
#!/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
我正在编写一个脚本:
#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
命令并解析 b
和 c
的参数。这在很大程度上得到了简化。
当我最后再次调用 function b
、function c
和 function b
作为后台进程时,我担心在分配 exported var1 variable
时可能会出现竞争条件到局部变量。
如果我可以保证对
function b
或function c
的调用将作为后台进程,我是否需要担心这里的竞争条件?如果没有竞争,我可以通过不声明每个函数的局部变量来逃脱吗?
每个后台进程都有自己的环境副本。子进程不能改变其父进程的环境。因此,不存在竞争条件:如果您在 运行 后台进程之前更改全局变量,该进程将复制新值。如果您在更改值之前 运行 一个后台进程,该进程将看到旧值。
#!/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