【发布时间】:2012-05-19 04:58:21
【问题描述】:
我正在实现一对用于进程间通信的类,其中一个进程将是唯一的写入者,并且会有很多读取者。一类处理阅读;一个处理写作。为了防止任何其他进程成为编写器,我想要编写器类的单个对象,该对象在其整个生命周期内保持对 boost::named_upgradable_mutex 的可升级锁定。为此,编写器类有一个boost::interprocess::upgradable_lock 类型的成员变量,在构造对象时将其传递给互斥锁。当写入器进程写入时,它会调用写入器类的 Write() 方法,该方法应该将该锁升级为独占,执行写入,并自动将独占锁降级为仅可再次升级。
按照Lock Transfers Through Move Semantics 上的 Boost 文档,我已经设法在我的 writer 类的 Write() 方法中实现了第一部分 - 将锁升级为独占。但是,第二部分 - 将锁降级为可升级 - 导致类型为 boost::interprocess::upgradable_lock 的新局部变量将超出范围并在 Write() 返回时释放互斥锁。我需要将该可升级锁放回我的班级的 upgradable_lock 成员变量中,以便升级功能将仅保留在我的 writer 对象中。最好的方法是什么?我唯一能想到的就是在返回之前将局部变量与我的成员变量交换。代码如下所示:
using boost::interprocess;
scoped_lock<named_upgradable_mutex> my_exclusive_lock(move(m_lock));
// do write here
upgradable_lock<named_upgradable_mutex> my_demoted_lock(move(my_exclusive_lock));
m_lock.swap(my_demoted_lock); // how else to do this?
这行得通,但最后一行确实违反直觉,我花了一段时间才想到。有没有更好的办法?是否可以将降级锁直接放入我的成员变量中?另外,重用成员变量来存储降级的锁,会不会产生意想不到的后果?
【问题讨论】:
标签: c++ boost mutex boost-interprocess