gpt4 book ai didi

C++,Qt - 锁定保护和返回对对象的不可分配引用的安全性

转载 作者:行者123 更新时间:2023-12-02 10:03:13 25 4
gpt4 key购买 nike

假设以下场景:

我已经实现了自己的 QReadWriteLockGuard:

class QReadWriteLockGuard {
public:
explicit QReadWriteLockGuard(QReadWriteLock & m) : m(m) {m.lockForRead();}
~QReadWriteLockGuard() {m.unlock();}

QReadWriteLockGuard(QReadWriteLockGuard const &) = delete;
void operator=(QReadWriteLockGuard &) = delete;

private:
QReadWriteLock & m;
};

我有一个“管理器”对象 A,它包含对象 B 的一个实例。

对象 A 有一个方法 get_b:
const B& A::get_b() const
{
QReadWriteLockGuard(_b_lock);
return *_b;
}

现在,B当然有它的子结构:属性、公共(public)方法等。假设另一个线程可以重写 _b的内容。随时,甚至删除它们,如果它们是指针的话。但是,它将调用 _b_lock.lockForWrite()第一的。

假设 B不可赋值(私有(private)赋值和复制操作符)。这样做是否安全:
A_instance.get_b().get_vector().at(i).do_stuff() ?

换句话说,读写锁是在执行 do_stuff()之前还是之后解锁? ?或者它可能是未定义的?

最佳答案

一个 const引用并不意味着对象是const ,只是您不能通过该引用修改对象。如果一个线程有 const引用并读取它,另一个线程写入同一个对象(通过非常量引用),那么你就有了数据竞争。

您的 QReadWriteLockGuard A::get_b() 时释放锁返回,因此无济于事。

对于这一行:

A_instance.get_b().get_vector().at(i).do_stuff();

考虑到它或多或少等同于
const B& b = A_instance.get_b();
b.get_vector().at(i).do_stuff();

在第一行之后,您已经释放了锁。

关于C++,Qt - 锁定保护和返回对对象的不可分配引用的安全性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61532289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com