维基百科的读写锁实现是否正确?

时间:2019-10-13 21:56:07

标签: c multithreading thread-safety locking mutex

我正在用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

我的问题是,这正确吗?因为我用一个使用者线程和一个或多个生产者线程进行了尝试,所以它没有用;消费者将阻塞并且队列不会为空。我很确定自己的实现与伪代码相同,但是最终我想出了自己的系统。

现在考虑一下,这可能是因为我的读取操作如何处理空队列。

另外,有人可以解释这篇文章中这句话的意思吗?

  

读锁定和写锁定中的每一个都有其自身的逆运算。

1 个答案:

答案 0 :(得分:2)

该实现在许多方面都令人震惊。我只是指出最明显的一点:读者在握住锁的同时进行阅读。因此,它甚至无法支持多个并发阅读器!

鉴于它实际上根本无法成为读者/作家的锁,分析其其他问题似乎毫无意义。毫不奇怪,它也没有喜欢作者,因为在没有读者之前,作家无法将writerWaiting设置为true。

顺便说一句,该页面上的两个互斥体实现也被严重破坏了。 * 叹气 *