让我们假设以下情况:
function add_to_list
{
thelist="$thelist $$"
}
for i in $(seq 1 100); do
add_to_list&
done
wait
echo "The list: $thelist"
这显然不能正常工作,因为线程正在访问相同的变量 - 应该如何正确地完成
答案 0 :(得分:2)
Bash不支持线程。只有子流程。并且无法在子流程中更改父流程的变量。
答案 1 :(得分:2)
您可以使用处理并发更新的共享存储,例如数据库。
以下是基于sqlite3的示例:
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"
答案 2 :(得分:1)
在我看来,你正在混淆线程和子处理语义,尤其是想要更新变量。
您可以使用命名管道来在进程之间进行通信。
$ mkfifo mypipe
$ cat < mypipe
$ seq 1 10 > mypipe
这使cat
打印序列。
bash-3.2$ cat always.sh
while : ; do
cat < mypipe
done
bash-3.2$ seq 1 100 > mypipe & seq 100 200 > mypipe & seq 200 300 > mypipe &
按顺序从always.sh
1到300创建。
我不确定是否可以安全地同步写入同一命名管道的多个进程。