在我们的应用程序中,我们处理在工作线程中处理并在显示线程中访问的数据,并且我们有一个负责关键部分的互斥锁。没什么特别的。
现在我们考虑重新编写我们的代码,其中当前锁定由持有和处理数据的一方明确完成。我们想到了一个单一的实体来保存数据,并且只以受保护的方式访问数据。
为此,我们有一个名为 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 库中?
我问是因为我认为这是一个相当通用且可用的概念。我找不到类似的东西。