Qt设计一个数据管理类,有一个QList成员,里面存放一些对象指针,为了多线程访问,还有一个QMutex成员,每次访问QList时都加锁,这种设计有什么优化方式?
时间: 2024-01-31 09:04:04 浏览: 60
Qt两种方法实现多线程并安全结束线程及QMutex加锁Qt单例化实现
为了优化数据管理类的设计,可以考虑引入读写锁(QReadWriteLock)。读写锁可以分为读锁和写锁两种类型,多个线程可以同时获取读锁,但只有一个线程能够获取写锁。这样就可以在多个线程之间更细粒度地控制访问权限,从而提高程序的并发性能。
以下是一个优化后的示例代码:
```cpp
class DataManager : public QObject
{
Q_OBJECT
public:
DataManager(QObject *parent = nullptr)
: QObject(parent)
{}
void addObject(QObject *obj)
{
QWriteLocker locker(&m_rwLock);
m_list.append(obj);
}
QList<QObject *> getObjects() const
{
QReadLocker locker(&m_rwLock);
return m_list;
}
private:
QList<QObject *> m_list;
mutable QReadWriteLock m_rwLock;
};
```
在上面的代码中,我们引入了一个读写锁 `m_rwLock`,并且将 `QList` 的访问分为两种类型:写操作和读操作。在写操作中,我们使用 `QWriteLocker` 获取写锁,并且使用 `QList::append` 向列表中添加新的对象指针。在读操作中,我们使用 `QReadLocker` 获取读锁,并且返回整个列表的副本。这样就可以在多个线程之间更细粒度地控制访问权限,从而提高程序的并发性能。
另外,我们还将 `m_rwLock` 声明为 `mutable`,这样可以在 `const` 成员函数中获取读写锁。
阅读全文