Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
BASH-使用同一变量的多个线程_Bash_Shell_Parallel Processing_Synchronization - Fatal编程技术网

BASH-使用同一变量的多个线程

BASH-使用同一变量的多个线程,bash,shell,parallel-processing,synchronization,Bash,Shell,Parallel Processing,Synchronization,让我们假设以下情况: function add_to_list { thelist="$thelist $$" } for i in $(seq 1 100); do add_to_list& done wait echo "The list: $thelist" 这显然不能正常工作,因为线程正在访问同一个变量-如何正确地执行它Bash不支持线程。只有子流程。并且不可能更改子进程中父进程的变量。Bash不支持线程。只有子流程。在子流程中更改父流程的变量是不可能的。在

让我们假设以下情况:

function add_to_list
{
    thelist="$thelist $$"
}

for i in $(seq 1 100); do
    add_to_list&
done

wait
echo "The list: $thelist"

这显然不能正常工作,因为线程正在访问同一个变量-如何正确地执行它

Bash不支持线程。只有子流程。并且不可能更改子进程中父进程的变量。

Bash不支持线程。只有子流程。在子流程中更改父流程的变量是不可能的。

在我看来,您将线程和子流程语义混为一谈,尤其是希望更新变量

您可以使用一个命名管道来在进程之间进行通信

 $ mkfifo mypipe 


 $ cat < mypipe


 $ seq 1 10 > mypipe

按顺序从
始终.sh
1到300创建


我不确定写入同一命名管道的多个进程是否能够安全地同步。

在我看来,您将线程和子进程语义混为一谈,尤其是希望更新变量

您可以使用一个命名管道来在进程之间进行通信

 $ mkfifo mypipe 


 $ cat < mypipe


 $ seq 1 10 > mypipe

按顺序从
始终.sh
1到300创建


我不确定写入同一命名管道的多个进程是否可以安全地同步。

您可以使用一个共享存储来处理并发更新,如数据库

以下是一个基于以下内容的示例:

函数创建表
{

sqlite3列表您可以使用处理并发更新的共享存储,如数据库

以下是一个基于以下内容的示例:

函数创建表
{

sqlite3列出Ok,然后调用子流程。那么这里可能的解决方案是什么?使用tmp文件将数据写入?Ok,然后调用子流程。那么这里可能的解决方案是什么?使用tmp文件将数据写入?如果我将其复制到test.sh脚本并使用bash…bash-x test.sh执行,我会得到语法错误:test.sh:line31:警告:此处文档第3行由文件结尾分隔(需要“%”)test.sh:第32行:语法错误:意外结束file@MikeSamaras事实上。问题是缩进应该用制表符完成,但复制/粘贴用空格替换制表符。用制表符替换前导的双空格,脚本应该可以正常运行。如果我将其复制到test.sh脚本并用bash…bash-x test.sh执行,我会得到语法错误:test.sh:line31:警告:此处文档位于第3行,由文件结尾分隔(需要“%”)test.sh:第32行:语法错误:意外的结尾file@MikeSamaras的确如此。问题是缩进应该用制表符来完成,但是复制/粘贴用空格来替换制表符。用制表符替换前导的双空格,脚本应该可以正常运行。
bash-3.2$ seq 1 100  > mypipe & seq 100 200  > mypipe & seq 200 300 > mypipe & 
function create_table
{
  sqlite3 thelist <<-%
  drop table t;
  create table t(one varchar(255));
  %
}

function add_to_list
{
  sqlite3 thelist <<-%
  .timeout 60000
  insert into t values('$$');
  %
}

function dump_list
{
  sqlite3 thelist <<-%
  select * from t;
  %
}

create_table
for i in $(seq 1 100); do
    add_to_list&
done

wait
thelist="$(dump_list)"
echo "The list: $thelist"