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

我正在编写一个带有多个读者和多个编写器的命名管道的程序。我们的想法是使用该命名管道来创建成对的读/写器。那是: 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管道吗? 先感谢您     
已邀请:
这将是信号量的典型用法: 创建2个信号量 - 一个用于读取已处理,另一个用于写入过程。将每个信号量设置为值1 对于读者,读取处理信号量的sem_wait(2)直到semphore> 0,如果得到它则将其降低到零。 编写过程将对用于它们的信号量执行相同的操作 控制进程(最初也可以设置信号量)可以检查两个信号量是否为零并分配对 读取器/写入器释放信号量(再次将它们增加1),以便下一个读取器或写入器将获得信号量。 对于读/写之间传递信息,可以使用共享内存...     

要回复问题请先登录注册