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"