读者/作家使用信号量的问题

时间:2019-01-14 01:06:24

标签: c linux multithreading

我是C和多线程编程的初学者。 我的教科书描述了一个读者-作家问题,这个问题对读者有利,它要求除非已授予作者使用该对象的权限,否则不要让读者一直等待。换句话说,任何读者都不应该仅仅因为作家正在等待而等待,下面是代码 enter image description here

其中

void P(sem_t *s); /* Wrapper function for sem_wait */
void V(sem_t *s); /* Wrapper function for sem_post */

和 w信号灯控制对访问共享对象的关键部分的访问。互斥信号量可保护对共享readcnt变量的访问,该变量计算当前关键部分中的阅读器数量。

我不太理解教科书的意思。在我看来,如果有读者,那么作者将无法更新共享对象。但是我的教科书说 '没有读者应该仅仅因为作家正在等待而等待' ,但是当作家正在写作时,它只会锁定w而不会执行任何操作停止读者以外的读者?

2 个答案:

答案 0 :(得分:1)

我们说有四个线程T1T2T3T4

Tl是作家,T2T3T4是读者。

现在让我们假设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.T2T3必须等待T4释放{{1} }。

答案 1 :(得分:0)

就像在第一条评论中一样,如果作者已经在写作,则不能中断该过程。您需要处理的情况是,正在发生某些事情(读取或写入),然后写入请求到达,然后在保持原始锁的同时到达读取器请求,您需要确保首先处理读取器请求。这有点复杂,但是您正在尝试学习,因此思考如何完成此任务实际上就是任务。去吧!尝试一些代码。如果您确实陷入困境,请再次询问。