2

複数のリーダーと複数のライターを持つ名前付きパイプを使用してプログラムを作成しています。アイデアは、その名前付きパイプを使用して、リーダー/ライターのペアを作成することです。あれは:

  • Aはパイプを読み取ります
  • Bはパイプに書き込みます(その逆)
  • ペアABが作成されました!

1つのプロセスのみが読み取りで、もう1つが書き込みであることを確認するために、flockで2つのロックを使用しました。ちょうどこのような。

リーダーコード:

echo "[JOB $2, Part $REMAINING] Taking next machine..."
    VMTAKEN=$((
    flock -x 200;
    cat $VMPIPE;
    )200>$JOINQUEUELOCK)

echo "[JOB $2, Part $REMAINING] Machine $VMTAKEN taken..."

ライターコード:

((
flock -x 200;
echo "[MACHINE $MACHINEID] I am inside the critical section"
echo "$MACHINEID" > $VMPIPE;
    echo "[MACHINE $MACHINEID] Going outside the critical section"
)200>$VMQUEUELOCK)

echo "[MACHINE $MACHINEID] Got new Job"

次の問題が発生することがあります。

[MACHINE 3] I am inside the critical section
[JOB 1, Part 249] Taking next machine...
[MACHINE 3] Going outside the critical section
[MACHINE 1] I am inside the critical section
[MACHINE 1] Going outside the critical section
[MACHINE 1]: Got new Job
[MACHINE 3]: Got new Job
[JOB 1, Part 249] Machine 3
1 taken...

ご覧のとおり、読者が読み終える前に別の作家が書いています。この問題を取り除くために私は何ができますか?ACKパイプか何かを使うべきですか?

前もって感謝します

4

1 に答える 1

0

これは、セマフォの一般的な使用法です。

  1. 2つのセマフォを作成します。1つは読み取り処理用、もう1つは書き込みプロセス用です。各セマフォを値1に設定します

  2. 読み取りは、リーダーのセマフォでsem_wait(2)を処理し、semphore> 0になるまで処理し、取得した場合はゼロに下げます。

  3. 書き込みプロセスは、それらを対象としたセマフォでも同じことを行います

  4. 制御プロセス(最初にセマフォを設定することもあります)は、両方のセマフォがゼロであるかどうかを確認し、ペアを割り当てることができます

  5. リーダー/ライターはセマフォを解放し(再び1ずつ増やします)、次のリーダーまたはライターがセマフォを取得します。

リーダー/ライター間で情報を渡すために、共有メモリを使用できます...

于 2011-09-16T12:35:06.570 に答える