【问题标题】:Locked write, unlocked read锁定写入,解锁读取
【发布时间】:2010-12-04 15:52:52
【问题描述】:

算法题

如何只允许对一个对象进行以下类型的线程操作?

  • 多个同时读取,无写入
  • 单写,不读

示例:STL 容器的包装器允许从多个线程进行高效搜索。为简单起见,假设无法从相关包装器外部访问迭代器。

假设我们有信号量和互斥量可供使用。

我知道 boost 库已经实现了这个概念。我想了解这通常是如何完成的。

【问题讨论】:

    标签: c++ multithreading


    【解决方案1】:

    使用boost::shared_mutex 处理频繁读取、不频繁写入的访问模式。

    正如您所指出的,STL 容器是“泄漏的”,因为您可以检索一个迭代器,该迭代器必须被视为写入(如果是非 const)或读取(如果是 const)的隐式持续操作,直到迭代器超出范围。当您持有这样的迭代器时,由其他线程写入容器可能会使它无效。您的包装器必须经过精心设计才能处理这种情况并保持包装器类的效率。

    【讨论】:

    • Boost 很棒,但我想知道它背后的算法。我在问题的最后部分提到了迭代器问题。
    • shared_mutex 后面的代码是平台相关的。在 Windows 上它非常高效,无法与其他平台通信。
    • 哇,那里的算法也依赖于平台吗?
    • 是的,任何锁定代码都将依赖于平台。 Boost 提供了一种方便的抽象,它不依赖于平台,并且可以让您自己重新获得语义。如果您想了解逻辑,可以查看 Boost 下载中的平台相关代码来比较实现。
    • 我问的是概念,而不是代码。算法是数学意义上的一系列原子操作。我相信它不应该依赖于平台。
    【解决方案2】:

    您想要一个“多读/单写”互斥锁:Boost.Thread 提供了一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 2012-07-15
      • 1970-01-01
      相关资源
      最近更新 更多