如何与子线程共享变量?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何与子线程共享变量?相关的知识,希望对你有一定的参考价值。
我想运行一个带有在子线程中启动的看门狗函数的bash脚本,它将在给定变量达到值时停止我的程序。该变量在主线程中递增。
var=0
function watchdog()
{
if [[ $var -ge 3 ]]; then
echo "Error"
fi
}
{ watchdog;} &
# main program loop
((var++))
这段代码中的问题是$ var保持为0.我也尝试在看门狗调用周围没有{},同样的结果。
我的代码风格好吗?
答案
您不能在bash
中的进程之间共享变量,并且它不支持多线程。所以你需要一种进程间通信。最简单的方法之一是使用命名管道,也称为FIFO。
这是和例子:
pipe='/tmp/mypipe'
mkfifo "$pipe"
var=0
# Your definition is not strictly correct (although it will work)
watchdog()
{
# Note the loop
while read var
do
if (( var >= 3 )) # a better way to do numeric comparisons
then
echo "Error $var"
else
echo "$var"
fi
sleep 2 # to prevent CPU hogging
done
}
watchdog < "$pipe" & # No need for a group
# main program loop - ??? I see no loop
((var++))
echo "$var" > "$pipe"
((var++))
echo "$var" > "$pipe"
((var++))
echo "$var" > "$pipe"
echo "waiting"
wait
rm "$pipe"
示例运行:
$ bash gash.sh
1
waiting
2
Error 3
但是我真的没有看到使用单独进程的重点。为什么不在每次更改后调用函数来测试值?
另一答案
如果您之前使用.
运行bashscript,它将使用相同的环境并可以更改现有变量。看这个:
$ cat test.sh
#!/usr/bin/env bash
a=12
echo $a
$ a=1
$ echo $a
1
$ ./test.sh
12
$ echo $a
1
$ . ./test.sh
12
$ echo $a
12
运行. ./test.sh
后,变量$ a已通过脚本更改。
以上是关于如何与子线程共享变量?的主要内容,如果未能解决你的问题,请参考以下文章
JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段