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