如何与子线程共享变量?

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已通过脚本更改。

以上是关于如何与子线程共享变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何将ThreadLocal传递到子线程

如何在线程之间共享变量?

多线程中共享变量——CCF总决赛试题

JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段

与子视图共享 PKCanvasView 作为图像

gevent如何保证多个协程之间不共享同一个线程局部变量