Как избежать нескольких писателей в именованном канале? - PullRequest
2 голосов
/ 29 декабря 2010

Я пишу программу с именованным каналом с несколькими читателями и несколькими авторами.Идея состоит в том, чтобы использовать этот именованный канал для создания пар читатель / писатель.То есть:

  • A читает канал
  • B пишет в канал (наоборот)
  • Создана пара AB!

Чтобы гарантировать, что только один процесс читает и один пишет, я использовал 2 блокировки с flock.Точно так же.

Код читателя:

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 Pipe или что-то еще?

Заранее спасибо

1 Ответ

0 голосов
/ 16 сентября 2011

Это типичное использование для семафоров:

  1. Создание 2 семафоров - один для обработанного чтения, другой для процессов записи.установите для каждого семафора значение 1

  2. Процессы чтения sem_wait (2) на семафоре для читателей до семфоры> 0 и уменьшите его до нуля, если они его получат.

  3. Процессы записи будут делать то же самое с семафором, предназначенным для них

  4. Управляющий процесс (который также может изначально устанавливать семафоры) может проверить, равны ли оба семафора нулюи назначьте пару

  5. , читатель / писатель освобождает семафоры (снова увеличивая их на 1), чтобы следующий читатель или писатель получал семафор.

Для передачи информации между читателем / писателем может использоваться общая память ...

...