【发布时间】:2013-03-11 00:58:12
【问题描述】:
在我们的应用程序中,我们处理在工作线程中处理并在显示线程中访问的数据,并且我们有一个负责关键部分的互斥锁。没什么特别的。
现在我们考虑重新编写代码,其中当前锁定由持有和处理数据的一方明确完成。我们想到了一个单独的实体来保存数据,并且只允许以受保护的方式访问数据。
为此,我们有一个名为 GuardedData 的类。调用者可以请求这样一个对象,并且应该在本地范围内只保留很短的时间。只要对象存在,它就会保持锁定。一旦对象被销毁,锁就会被释放。数据访问与锁定机制相结合,调用者无需进行任何明确的额外工作。班级的名字让来电者想起了现在的守卫。
template<typename T, typename Lockable>
class GuardedData {
GuardedData(T &d, Lockable &m) : data(d), guard(m) {}
boost::lock_guard<Lockable> guard;
T &data;
T &operator->() { return data; }
};
再次,一个非常简单的概念。 operator-> 模仿 STL 迭代器的语义来访问有效负载。
现在我想知道:
- 这种方法众所周知吗?
- 是否有类似这样的模板类已经可用,例如在 boost 库中?
我问是因为我认为这是一个相当通用且可用的概念。不过我找不到类似的东西。
【问题讨论】:
-
我有可以在后台更改的数据,而在前台访问它。实际上,当后台计算完成时交换数据。当有人访问数据时不应发生这种交换,这可能导致该方进入不一致的状态。我们需要进行交换,而不是仅仅创建一个新实例,而其他人仍在使用旧实例。原因是大量数据会同时驻留在内存中。
标签: c++ design-patterns concurrency mutex guard