qt类 可重入

来源:互联网 发布:windows informix 编辑:程序博客网 时间:2024/06/06 10:44

如果类的不同实例,可以同时用于不同的线程中,那么这个类就是可重入的。


比如一个类ClassA,它的两个实例,A_1 和 A_2。

A_1在主线程中使用,A_2在子线程中使用。这两个实例可以在两个线程中同时被使用。那么就说类ClassA是可重入的。


QT中的大部分 非界面类 都是可重入的。  也就是说,这些类的不同实例,可以在不同的线程中被使用。



然而,多个线程,同时访问一个可重入类的一个实例,是不安全的。

比如,主线程和子线程同时访问 A_1。

这是不安全的。

必须要加锁才行。


比如QThread类。这个类就是可重入的。

但是在DownLoadThread类中,对成员变量bool m_bStop的访问是必须要加锁的。

因为主线程会调用SetValue()方法,修改m_bStop。而DownLoadThread实例中,也会读取m_bStop的值。会有主线程和子线程同时使用m_bStop的情况。

所以,必须加锁



可重入的门槛很低,大部分 非图像界面类 都是可重入的。

因为,在主线程中使用A_1,在子线程中使用A_2。A_1和A_2 是不同的内存地址。除非类ClassA中有共享数据,静态成员变量。否则一般的类,都是可重入的。



Qt中,所有的 图像界面类,都是不可重入的。QWidget及其子类,都是不可重入的。

即,不能够在子线程中,使用Qt的图形界面类。

如果想在子线程中,修改某个QLabel的文字,那么只能向主线程发射信号,让主线程修改QLabel的文字。


0 0
原创粉丝点击