我对读者/作者信号量解决方案失败感兴趣,写作者优先。
在以下代码中,取自维基百科:
READER
P(mutex_3);
P(r);
P(mutex_1);
readcount := readcount + 1;
if readcount = 1 then P(w);
V(mutex_1);
V(r);
V(mutex_3);
reading is performed
P(mutex_1);
readcount := readcount - 1;
if readcount = 0 then V(w);
V(mutex_1);
...有一个二进制信号量mutex_3
,它限制了尝试访问r
信号量的线程数,以便编写者具有优先权。
我尝试删除那个互斥锁,期待作家挨饿,但没有成功。
我用Java编写了一个程序,其中线程等待两次固定的时间:在读/写之后和期间。我创建了一个编写器进程和8个读取器进程,并将等待数量设置为1毫秒。我尝试创造一种情况,其中r
信号量不断遭到一位作家和许多读者的攻击。这些都没有导致我的预期失败。
我做错了吗?我怎么能导致作家饥饿?
答案 0 :(得分:1)
在这个问题中 - 来自wikipedia -
int readcount, writecount; (initial value = 0)
semaphore mutex_1, mutex_2, mutex_3, w, r ; (initial value = 1)
READER
P(mutex_3);
P(r);
P(mutex_1);
readcount := readcount + 1;
if readcount = 1 then P(w);
V(mutex_1);
V(r);
V(mutex_3);
reading is performed
P(mutex_1);
readcount := readcount - 1;
if readcount = 0 then V(w);
V(mutex_1);
WRITER
P(mutex_2);
writecount := writecount + 1;
if writecount = 1 then P(r);
V(mutex_2);
P(w);
writing is performed
V(w);
P(mutex_2);
writecount := writecount - 1;
if writecount = 0 then V(r);
V(mutex_2);
实际上很难让读者饿死,但从理论上讲,他们可能会这样做。
问题是作家优先于读者,所以如果你一直有作家,读者将永远等待执行。
希望它有所帮助!