【发布时间】:2010-12-04 15:52:52
【问题描述】:
算法题
如何只允许对一个对象进行以下类型的线程操作?
- 多个同时读取,无写入
- 单写,不读
示例:STL 容器的包装器允许从多个线程进行高效搜索。为简单起见,假设无法从相关包装器外部访问迭代器。
假设我们有信号量和互斥量可供使用。
我知道 boost 库已经实现了这个概念。我想了解这通常是如何完成的。
【问题讨论】:
标签: c++ multithreading
算法题
如何只允许对一个对象进行以下类型的线程操作?
示例:STL 容器的包装器允许从多个线程进行高效搜索。为简单起见,假设无法从相关包装器外部访问迭代器。
假设我们有信号量和互斥量可供使用。
我知道 boost 库已经实现了这个概念。我想了解这通常是如何完成的。
【问题讨论】:
标签: c++ multithreading
使用boost::shared_mutex 处理频繁读取、不频繁写入的访问模式。
正如您所指出的,STL 容器是“泄漏的”,因为您可以检索一个迭代器,该迭代器必须被视为写入(如果是非 const)或读取(如果是 const)的隐式持续操作,直到迭代器超出范围。当您持有这样的迭代器时,由其他线程写入容器可能会使它无效。您的包装器必须经过精心设计才能处理这种情况并保持包装器类的效率。
【讨论】:
shared_mutex 后面的代码是平台相关的。在 Windows 上它非常高效,无法与其他平台通信。
您想要一个“多读/单写”互斥锁:Boost.Thread 提供了一个。
【讨论】: