1

私は OSX で作業しており、シェルに bash を使用しています。実行可能ファイルを何百回も呼び出すスクリプトがあり、各呼び出しは互いに独立しています。したがって、このコードを並行して実行します。ただし、実行可能ファイルを呼び出すたびに、コミュニティ テキスト ファイルの新しい行に出力が追加されます。

テキスト ファイルの順序は重要ではありません (ただし、UNIX の sort コマンドを使用するだけなので、複雑にする価値はまったくありません)。私の懸念は、スクリプトを並行して実行すると、異常な偶然によって 2 つのスレッドがテキスト ファイルをチェックアウトし、それに出力してから、別のコピーをテキスト ファイルの元のディレクトリに保存することです。したがって、ファイルへの書き込みの 1 つを無効にします。

これは実際に起こりますか、それともファイルへの印刷に関する私の理解に問題がありますか? これもケースバイケースであるかどうかは完全にはわからないので、以下のプログラムで行われていることのモックコードを提供します。

脚本:

#!/bin/sh
abs=$1
input=$(echo "$abs" | awk '{print 0.004 + 0.005*$1 }')
./program input

"。/プログラム":

~~Normal .c file stuff here~~
~~VALUE magically calculated here~~
~~run number is pulled out of input and assigned to index for sorting~~

FILE *fpp;
fpp = fopen("Doc.txt","a");
fprintf(fpp,"%d, %.3f\n", index, VALUE);
fclose(fpp);

~Closing events of program.c~~

bash でスクリプトを並行して実行するコマンド:

printf "%s\n" {0..199} | xargs -P 8 -n 1 ./program

皆さんが提供できる助けをありがとう。

4

4 に答える 4

2

競合状態はあなたが考えているものです。

100%確かではありませんが、ファイルを開いて編集するのではなく、ファイルの最後に単純に追加する場合は正しいはずです

于 2013-06-05T01:36:36.923 に答える
2

オプションがある場合は、プログラムでファイルに直接書き込むのではなく、標準出力に書き込むようにします。次に、シェルにプログラムの出力をマージさせることができます。

printf "%s\n" {0..199} | parallel -P 8 -n 1 ./program  > merged_output.txt
于 2013-06-05T13:11:53.177 に答える
1

ええ、それは災害のレシピのように見えます。これらのプロセスの両方がほぼ同時にファイルを開くことにヒットした場合、1 つだけが "かかります"。

(より簡単に)個別のファイルに書き込み、処理が完了したらそれらをまとめるか、(より困難に)すべての結果をすべてのファイルを書き込むコンシューマープロセスに送信することをお勧めします。

于 2013-06-05T01:38:59.343 に答える