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 に答える