类实例线程亲和性对其数据是不是有任何影响?

Posted

技术标签:

【中文标题】类实例线程亲和性对其数据是不是有任何影响?【英文标题】:Does a class instance thread affinity have any impact on its data?类实例线程亲和性对其数据是否有任何影响? 【发布时间】:2015-06-19 15:38:47 【问题描述】:

我们从QThread知道documentation

QObject 实例被称为具有线程亲和性,或者说它存在 在某个线程中。当 QObject 接收到排队的信号或 发布的事件,插槽或事件处理程序将在线程中运行 对象居住在其中。

线程亲和性对类实例数据有影响吗?类数据会变成线程数据吗?

除了上述之外,我问的原因是因为我想在其构造函数中传递另一个类的指针/引用。如果我是面向对象的,我不会直接访问它的数据,但是如果我调用另一个类的成员函数,它也会在这个类的线程中调用吗?

【问题讨论】:

引用没有谈论类,而是谈论[类]的实例,这让我想知道你是否只是混淆了这两者。或者,您是否要引用类静态数据,它可以称为“类数据”而不是“实例数据”。 @UlrichEckhardt 我是指文档中的类对象实例,而不是类本身,我想我不想太罗嗦。 请去编辑你的问题,把它说清楚! @UlrichEckhardt 既然你坚持,更新我的帖子:) 【参考方案1】:

线程亲和性对类数据有影响吗?

不,QObject 的线程亲和性仅控制其插槽和事件处理程序在哪个线程中运行。

类数据会变成线程数据吗?

类数据是指类静态数据成员——不可能受每个实例的线程亲和性影响。实例数据也不是以某种方式成为线程本地的:线程本地存储可能非常有限,根本没有理由强制每个实例都进入其中。

除了以上...

如果你不发出信号或事件,正常的方法调用只是方法调用。

【讨论】:

以上是关于类实例线程亲和性对其数据是不是有任何影响?的主要内容,如果未能解决你的问题,请参考以下文章

将对象的亲和性从 QThread 更改为主 GUI 线程

多线程高并发之Synchronized锁及其膨胀

Linux 编程之进程篇:调度优先级亲和性和资源限制

Linux 编程之进程篇:调度优先级亲和性和资源限制

Linux 编程之进程篇:调度优先级亲和性和资源限制

关于单例模式这种比上面12都好一些,既实现了线程安全,又避免了同步带来的性能影响。