8

我想控制对一堆数据类的 getter 和 setter 的访问,以使它们可以同时从多个线程安全地访问。我之前在 Java 中使用 java.util.concurrent.locks.ReentrantReadWriteLock 完成了这项工作,而且非常轻松。

但是现在我在当前的 C++ 项目中遇到了很多麻烦,因为我找不到可重入读/写锁实现。具体来说,我想要一个允许线程在已经拥有写锁的情况下获得读锁,而不会阻塞,也不会首先放弃写锁。

原因很简单:我的一些 setter 方法调用 getter 方法,前者(通常)获得写锁,后者获得读锁。我不想为了解决锁类中的限制而扭曲我简单的 getter/setter 架构。

我已经尝试过 Qt (4.8) QReadWriteLock 和相关类,以及 Boost 的 unique_lock 和 shared_lock。两个库都没有实现我需要的可重入性。Boost 的其他部分是否解决了这个问题?

或者有没有其他图书馆有这个?我真的很惊讶 Qt 和 Boost 似乎都没有,因为它似乎是一个明显可取的功能。(自 2004 年以来,它一直是 Java 标准库的一部分。)

4

1 回答 1

4

作为涉足 C++ 多线程的人,我不确定您是否会在广泛分布的库中找到此功能。据我所知,boost 线程、std 线程和 POSIX 线程不允许这样做。

因此,为了解决您的问题,我建议如下:

  1. 再看看您的锁定方案和您正在共享的数据。有没有其他方法可以完成你打算做的事情?

  2. 尝试实现您自己的锁定原语版本。它应该只是您选择的任何库中已经可用的原语的相对简单的扩展。另外,请与社区分享,因为我相信您不会是唯一遇到此问题的人。

于 2013-06-27T00:33:40.663 回答