0

让我们假设以下情况:

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

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

wait
echo "The list: $thelist"

这显然不能正常工作,因为线程正在访问同一个变量 - 应该如何正确完成

4

3 回答 3

3

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

于 2013-02-15T10:09:30.810 回答
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"
于 2013-02-15T23:59:44.470 回答
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.sh1 到 300 按顺序创建。

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

于 2013-02-15T11:29:53.657 回答