c++ qt 跨线程类对象之间利用信号槽传递指针 ,接收线程中修改指针指向的数据会影响发送线程中对应指针指向的数据吗
时间: 2023-11-04 07:11:13 浏览: 142
QT信号与槽来实现对象通信
4星 · 用户满意度95%
在 C++ Qt 中,跨线程传递类对象指针时,如果接收线程中修改了指针指向的数据,会影响发送线程中对应指针指向的数据。这是因为不同线程之间共享同一份内存空间,所以一个线程中对内存的修改会影响到其他线程中对同一份内存的访问。
为了避免这种情况,可以采用以下方法:
1.使用线程安全的容器,如 QMutex、QReadWriteLock 等来保护共享数据。
2.对于只读数据,可以采用深拷贝的方式,将数据复制到接收线程中进行操作,这样不会影响到发送线程中的数据。
3.对于可读写的数据,可以采用复制-修改-合并的方式,在接收线程中对数据进行修改后,将修改后的数据合并到发送线程中的数据中。
下面是一个示例代码,演示如何使用 QReadWriteLock 对共享数据进行保护:
```cpp
// MyClass.h
class MyClass : public QObject
{
Q_OBJECT
public:
MyClass(QObject *parent = nullptr);
signals:
void sendData(MyClass *obj);
public slots:
void receiveData(MyClass *obj);
private:
QString m_data;
QReadWriteLock m_lock;
};
// MyClass.cpp
MyClass::MyClass(QObject *parent)
: QObject(parent)
{
connect(this, &MyClass::sendData, this, &MyClass::receiveData);
}
void MyClass::receiveData(MyClass *obj)
{
QWriteLocker locker(&m_lock); // 加写锁
m_data = obj->m_data; // 修改共享数据
}
// 在另一个线程中使用
MyClass *obj = new MyClass();
obj->m_data = "Hello";
emit obj->sendData(obj);
```
在上面的示例中,MyClass 类中定义了一个共享数据 m_data 和一个 QReadWriteLock 对象 m_lock,用来保护共享数据。在 receiveData 槽函数中,先加写锁,然后修改共享数据,最后释放锁。在另一个线程中,修改共享数据后,通过信号发送 MyClass 对象的指针。由于 QReadWriteLock 的保护,即使发送线程和接收线程同时访问共享数据,也不会出现数据不一致的情况。
阅读全文