【问题标题】:Read write mutex in C++C ++中的读写互斥锁
【发布时间】:2011-01-21 00:27:44
【问题描述】:

这是一道面试题。你如何实现读/写互斥锁?将有多个线程读取和写入资源。我不知道该怎么做。如果需要任何信息,请告诉我。

更新:我不确定我上面的陈述是否有效/可以理解。但我真正想知道的是,就互斥锁和其他所需的同步对象而言,如何在单个对象上实现多次读取和多次写入?

【问题讨论】:

  • 您说的是普通互斥锁还是使用互斥锁/信号量/条件变量实现的多读/单写互斥锁?
  • @stefaanv:我不确定,但我认为它适用于使用互斥体/信号量/条件变量实现的多读/多写互斥锁。有这样的事情/方式吗?
  • 多读/单写互斥锁并不简单,我只是试了一下但失败了:-(所以这里是维基百科链接:en.wikipedia.org/wiki/Readers-writer_lock
  • 你如何使用什么来实现某个互斥锁?你需要某种基本的同步能力,我怀疑所有平台上的基本原理都是一样的。这至少需要一个平台标签。
  • 这个答案显示了一个使用 boost 的 MRSW 互斥锁:stackoverflow.com/questions/989795/…

标签: c++ multithreading mutex


【解决方案1】:

查看Dekker's algorithm

Dekker 算法是第一个已知的 相互的正确解决方案 并发排斥问题 编程。解决方案是 归功于荷兰数学家Th。 J. Dekker 由 Edsger W. Dijkstra 在他的 合作顺序手稿 过程。它允许两个线程 共享一次性资源 冲突,只使用共享内存 交流。

请注意,Dekker 的算法使用spinlock(不是busy waiting)技术。
(Th. J. Dekker 的解决方案,由 E. W. Dijkstra 在他的EWD1303 paper 中提到)

【讨论】:

  • 我喜欢你刚刚回答了这个问题,而不是进入操作系统的本质:)
【解决方案2】:

简短的回答是令人惊讶地很难滚动你自己的读/写锁。很容易错过一个非常微妙的计时问题,可能导致死锁,两个线程都认为他们有一个“独占”锁,等等。

简而言之,您需要计算在任何特定时间有多少读者处于活跃状态。只有当活动读者的数量为零时,您才应该授予线程写访问权限。关于是否优先考虑读者或作者,有一些设计选择。 (通常,假设写入频率较低,您希望给予写入者优先级。)(令人惊讶的是)棘手的部分是确保在有读取者时不授予写入者访问权限,反之亦然。

有一篇出色的 MSDN 文章 "Compound Win32 Synchronization Objects" 将带您了解如何创建读取器/写入器锁。它开始很简单,然后变得更加复杂以处理所有极端情况。突出的一件事是他们展示了一个看起来非常好的样本——然后他们会解释为什么它实际上不起作用。如果他们没有指出问题,你可能永远不会注意到。值得一读。

希望这有帮助。

【讨论】:

    【解决方案3】:

    这对于面试来说听起来是一个相当困难的问题;我不会“实现”一个读/写互斥锁,从头开始写一个——有更好的现成解决方案可用。现实世界中明智的做法是使用现有的互斥锁类型。也许他们真正想知道的是您将如何使用这种类型?

    【讨论】:

    • ShellShock:读/写互斥锁是否可以不通过常规互斥锁和信号量来实现?我不熟悉信号量,但我感觉面试官正在引导我找到那个解决方案。
    • 您可以推荐任何现成解决方案的示例吗?
    【解决方案4】:

    Afaik 您需要一个原子比较和交换指令,或者您需要能够禁用中断。请参阅维基百科上的Compare-and-swap。至少,这就是操作系统实现它的方式。如果您有操作系统,请站在它的肩膀上,使用现有的库(例如boost)。

    【讨论】:

      猜你喜欢
      • 2010-12-08
      • 2022-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-23
      • 1970-01-01
      • 2017-07-01
      • 2011-08-10
      相关资源
      最近更新 更多