让我们假设以下情况:
function add_to_list
{
thelist="$thelist $$"
}
for i in $(seq 1 100); do
add_to_list&
done
wait
echo "The list: $thelist"
这显然不能正常工作,因为线程正在访问同一个变量 - 应该如何正确完成
让我们假设以下情况:
function add_to_list
{
thelist="$thelist $$"
}
for i in $(seq 1 100); do
add_to_list&
done
wait
echo "The list: $thelist"
这显然不能正常工作,因为线程正在访问同一个变量 - 应该如何正确完成
Bash 不支持线程。只有子进程。并且不可能在子流程中更改父流程的变量。
您可以使用处理并发更新的共享存储,例如数据库。
这是一个基于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"
在我看来,您将线程和子处理语义混为一谈,尤其是希望更新变量。
您可以使用命名管道来在进程之间进行通信。
$ 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 按顺序创建。
我不确定写入同一命名管道的多个进程是否安全同步。