在另一个函数中增强读/写锁



情况如下

boost::shared_mutex   rwlock;

void test()
{
    boost::unique_lock < boost::shared_mutex > writelock(rwlock); 
    // here we have deadlock
}
int main()
{
    boost::shared_lock < boost::shared_mutex > readlock(rwlock); 
    test();
}

我知道我们可以这样做:

{
    boost::upgrade_lock<boost::shared_mutex> upgradeable_lock(rwlock); // here we obtain readlock
    {
       boost::upgrade_to_unique_lock<boost::shared_mutex> uniqueLock(upgradeable_lock); // right now we upgrade readlock to writelock
    }
}

但是如果像我的第一个例子,我们有另一个作用域,我们看不到upgradeable_lock。如何解决这个问题?

我认为,实际的代码要困难得多,在调用堆栈中多次获取读锁,然后需要在某个地方写入,这是从未预料到的。

我在这里是一个猜测,但如果这是真的,你不想改变它,你将不得不从你的编写函数调用路径,并总是在你做相关调用之前释放shared_lock,然后再次获得它。

读/写锁是很棒的,但它们往往会误导开发人员使用膨胀式读锁。

只要你能重构,试着把读锁减少到那些你真正需要读的地方。保持临界区尽可能短,并避免在其中调用函数,因为调用函数也可能获得该锁。

当你这样做了,一个函数的变化,现在也必须写,将不再是一个大问题。顺便说一句,这也将提高并发性,因为写程序将有更多的机会找到一个没有读程序持有读锁的时刻。你可能更喜欢现在做重构,因为它会让以后的工作容易得多。

另一种猜测:如果您使用这些读锁在较长的进程中保持数据的稳定状态,那么您现在可能需要重新考虑这个选择。你真正想要的,是某种软件事务性内存。

最新更新