我正在尝试为读者偏好实现读者 - 写作者问题的解决方案。 以下是问题陈述:
我想出了以下伪代码。
有人可以告诉我以下解决方案是否足够,以及它有什么问题?
initialize()
{
initialize semaphore with value 0
initialize reader_active_count with value 1
}
writer()
{
// Wait until reader thread makes the semaphore non-zero
sem_wait(s)
write data;
sem_post(s)
}
reader()
{
lock(r1)
reader_active_count ++;
// Am I the first reader thread
if (reader_active_count == 1)
{
// Wait until writer thread makes the semaphore non-zero
sem_wait(s);
}
unlock(r1)
read data
lock(r1)
reader_active_count--;
// Am I the last reader thread
if(reader_active_count == 0)
{
// Increment the sempahore to a non-zero value
sem_post(s);
}
unlock(r1)
}
答案 0 :(得分:2)
虽然看起来你的代码会阻止多个编写器,并且在允许多次读取时会阻止并发写入和读取访问,但它不会比读者更喜欢读者。
考虑线程1正在写入并且线程2出现的情况,也想要写入。然后线程3想要阅读。
线程1将释放信号量,使其为非零。如果你的线程调度程序是公平的(即严格的FIFO),那么线程2将获得下一个信号量,因为它是第一个。如果您的调度程序不是严格的FIFO,则其中一个线程可以是下一个获取信号量的线程。
如果你想吸引读者而不是作家,那么你需要一些方法让读者在队列中获得更高的优先级。