我是C和多线程编程的初学者。 我的教科书描述了一个读者-作家问题,这个问题对读者有利,它要求除非已授予作者使用该对象的权限,否则不要让读者一直等待。换句话说,任何读者都不应该仅仅因为作家正在等待而等待,下面是代码
其中
void P(sem_t *s); /* Wrapper function for sem_wait */
void V(sem_t *s); /* Wrapper function for sem_post */
和 w信号灯控制对访问共享对象的关键部分的访问。互斥信号量可保护对共享readcnt变量的访问,该变量计算当前关键部分中的阅读器数量。
我不太理解教科书的意思。在我看来,如果有读者,那么作者将无法更新共享对象。但是我的教科书说 '没有读者应该仅仅因为作家正在等待而等待' ,但是当作家正在写作时,它只会锁定w而不会执行任何操作停止读者以外的读者?
答案 0 :(得分:1)
我们说有四个线程T1
,T2
,T3
,T4
。
Tl
是作家,T2
,T3
,T4
是读者。
现在让我们假设T1
首先得到调度,并锁定信号量w
,一旦完成,它就会释放w
。
现在,在此之后,假设T2
已被调度并锁定了信号量mutex
,并增加了全局变量readcnt
,并且由于这是第一个读取器,因此它会锁定信号量{{1 }}。并释放信号量w
。然后进入关键部分。
现在,如果mutex
被调度,它将获取信号量T3
并增加全局变量mutex
并释放信号量互斥量,然后进入关键部分。
现在,如果readcnt
被再次调度,则它无法获取T1
,因为它由读取器线程w
持有。在最后一个阅读器线程退出之前,T2
无法获取T1
。如果编写者w
正在等待并且同时安排T1
,则T4
将执行,因为它不需要锁定T4
。
所以教科书说w
。
但是正如伦纳德在另一个答案中所说的,no reader should wait simply because a writer is waiting
所以if the writer is already writing, you can't interrupt that process.
,T2
,T3
必须等待T4
释放{{1} }。
答案 1 :(得分:0)
就像在第一条评论中一样,如果作者已经在写作,则不能中断该过程。您需要处理的情况是,正在发生某些事情(读取或写入),然后写入请求到达,然后在保持原始锁的同时到达读取器请求,您需要确保首先处理读取器请求。这有点复杂,但是您正在尝试学习,因此思考如何完成此任务实际上就是任务。去吧!尝试一些代码。如果您确实陷入困境,请再次询问。