Я пишу программу с именованным каналом с несколькими читателями и несколькими авторами.Идея состоит в том, чтобы использовать этот именованный канал для создания пар читатель / писатель.То есть:
- 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 или что-то еще?
Заранее спасибо