Multithreading 具有读者偏好的读者-作者实现方案
我正在尝试为读者-作者问题实施一个解决方案,解决读者偏好问题。 以下是问题陈述:Multithreading 具有读者偏好的读者-作者实现方案,multithreading,pthreads,Multithreading,Pthreads,我正在尝试为读者-作者问题实施一个解决方案,解决读者偏好问题。 以下是问题陈述: 数据在一个写线程和多个读线程之间共享 如果写入线程正在访问共享数据,则读线程应等待 如果另一个读卡器线程正在访问共享数据,则读卡器线程不应等待 我提出了以下伪代码 有人能告诉我下面的解决方案是否足够,有什么问题吗 initialize() { initialize semaphore with value 0 initialize reader_active_count with value 1 }
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)
}
虽然看起来您的代码将阻止多个写入程序,并且在允许多个读取的同时将阻止并发写和读访问,但它不喜欢读程序而不是写入程序 考虑线程1正在写入,而线程2也正在写入的情况。然后线程3想要读取 线程1将释放信号量,使其非零。如果线程调度程序是公平的(即严格意义上的FIFO),那么线程2接下来将获取信号量,因为它是第一行。如果您的调度程序不是严格意义上的FIFO,那么任何一个线程都可以是下一个获取信号量的线程
如果你想让读者优先于作者,那么你需要某种方式让读者在队列中享有更高的优先级。谢谢你的评论。在您提到的场景中,线程3应该释放信号量,因为只有当读卡器\u active\u计数达到0时才释放信号量。@achitmehta:Yes。只有当线程3在等待第一次锁定时被阻塞,而线程1在清理时将其锁定时,才会出现争用条件。然后线程1将是最后一个读卡器并释放信号量,让线程2在线程3增加
读卡器活动\u计数之前获取信号量。