如何避免命名管道中的多个编写器?

时间:2010-12-29 14:32:54

标签: unix ipc named-pipes multiprocess

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

  • A读取管道
  • B写入管道 (反之亦然)
  • 对A-B创建了!

为了确保只有一个进程正在读取而另一个正在写入,我使用了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管道吗?

提前谢谢

1 个答案:

答案 0 :(得分:0)

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

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

  2. 读取信号量的sem_wait(2)以供读者使用,直到semphore>如果他们得到它,则将其降低到零。

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

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

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

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