2

我正在编写一个带有多个读取器和多个写入器的命名管道的程序。这个想法是使用该命名管道来创建读取器/写入器对。那是:

  • 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 管道还是什么?

先感谢您

4

1 回答 1

0

这将是信号量的典型用途:

  1. 创建 2 个信号量 - 一个用于读取处理,另一个用于写入处理。将每个信号量设置为值 1

  2. 在信号量上为读者读取进程 sem_wait(2) 直到信号量 > 0,如果他们得到它,则将其降低为零。

  3. 编写过程将对用于它们的信号量执行相同的操作

  4. 一个控制过程(它也可以最初设置信号量)可以检查两个信号量是否为零并分配对

  5. 读取器/写入器释放信号量(再次将它们增加 1),因此下一个读取器或写入器将获得信号量。

为了在读写器之间传递信息,可以使用共享内存...

于 2011-09-16T12:35:06.570 回答