次の状況を想定します。
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まで順番に作成します。
同じ名前付きパイプに書き込む複数のプロセスが安全に同期されているかどうかはわかりません。