这是一个面试问题。如何实现读写互斥锁?会有多个线程读取和写入资源。我不确定该如何处理。如果需要任何信息,请告诉我。
更新:我不确定我上面的陈述是否有效/可理解。但我真正想知道的是,如何在互斥锁和其他所需同步对象方面实现对单个对象的多次读取和多次写入。
更新:我不确定我上面的陈述是否有效/可理解。但我真正想知道的是,如何在互斥锁和其他所需同步对象方面实现对单个对象的多次读取和多次写入。
请查看德克尔算法。
德克尔算法是并发编程中互斥问题的第一个已知正确解决方案。该解决方案归功于荷兰数学家Th.J.Dekker,由Edsger W. Dijkstra在他的合作顺序进程手稿中提出。它允许两个线程共享单一的资源而不会发生冲突,仅使用共享内存进行通信。
请注意,Dekker算法使用自旋锁(而不是忙等待)技术。
(Th.J.Dekker的解决方案,由E.W.Dijkstra在他的EWD1303 paper中提到)
简而言之,自己编写读/写锁是非常困难的,这可能会导致死锁、两个线程都认为它们拥有“独占”锁等非常微妙的时间问题。
简单来说,您需要在任何特定时间内保持活动读者的计数。只有当活动读者数量为零时,才应授予线程写入访问权限。关于读者或写者谁优先的设计选择有一些选择。(通常,您希望给写者优先权,因为写入不太频繁。)(令人惊讶的)棘手部分是确保没有读者时给予写者访问权限,反之亦然。
有一篇出色的MSDN文章"Compound Win32 Synchronization Objects", 它带您了解如何创建读/写锁。它从简单开始,然后变得更加复杂以处理所有边角情况。其中一个突出的事情是,他们展示了一个看起来完全正常的样本,然后他们会解释为什么它实际上不起作用。如果他们没有指出问题,您可能永远不会注意到。非常值得一读。
希望这有所帮助。
这似乎是一道相当困难的面试问题;我不会“实现”读/写互斥锁,也就是从头开始编写一个--有更好的现成解决方案可用。明智的现实做法是使用现有的互斥锁类型。也许他们真正想知道的是你如何使用这样的类型?