我正在用SDL线程和互斥锁在C中实现 write-preferring R / W锁。我https://cloud.google.com/deployment-manager/docs/configuration/templates/using-schemas:
读取器和写入器的输入:互斥锁mu,条件变量cond,整数readersWaiting = 0和布尔型writerWaiting = false。
阅读器:
- 锁定亩
- 虽然writerWaiting为true:
- 等待cond,mu [a]
- 增加读者等待人数
- 读取操作
- 减数读者等待
- 读者正在等待> 0:
- 等待,亩
- 通知状态(信号)
- 解锁亩
作家:
- 锁定亩
- 虽然writerWaiting为true:
- 等待,亩
- 写操作
- 将writerWaiting设置为true
- 读者正在等待> 0:
- 等待,亩
- 将writerWaiting设置为false
- 通知cond(广播)
- 解锁亩
我相信SDL可以满足此要求
wait:这是对条件变量的标准“ wait”操作,除其他操作外,该操作还会释放互斥锁m
我的问题是,这正确吗?因为我用一个使用者线程和一个或多个生产者线程进行了尝试,所以它没有用;消费者将阻塞并且队列不会为空。我很确定自己的实现与伪代码相同,但是最终我想出了自己的系统。
现在考虑一下,这可能是因为我的读取操作如何处理空队列。
另外,有人可以解释这篇文章中这句话的意思吗?
读锁定和写锁定中的每一个都有其自身的逆运算。
答案 0 :(得分:2)
该实现在许多方面都令人震惊。我只是指出最明显的一点:读者在握住锁的同时进行阅读。因此,它甚至无法支持多个并发阅读器!
鉴于它实际上根本无法成为读者/作家的锁,分析其其他问题似乎毫无意义。毫不奇怪,它也没有喜欢作者,因为在没有读者之前,作家无法将writerWaiting
设置为true。
顺便说一句,该页面上的两个互斥体实现也被严重破坏了。 * 叹气 *