在哪个线程中执行槽

In which thread are the slots executed?

本文关键字:执行 线程      更新时间:2023-10-16

假设我有四个线程,它们具有以下对象:

线程1:管理boost::signals2对象。称之为s

线程2:管理X对象和对s的引用。调用X对象o2。成员函数X::do()连接s,在o2上执行。

线程3:管理一个Y对象和对s的引用。调用Y对象o3。成员函数Y::do()连接s,在o3上执行。

线程4:管理对s的引用,emit发出信号。

槽在哪里执行?所有这些都在线程4中,emit调用发生的地方?超过线程1,因为这是信号的内存地址所在的线程?或者每个插槽在其对应的线程(2和3)上执行?

最明显的是插槽在thread 4上执行,因为有信号发出(调用是同步的),但对我来说,执行函数的线程,或者一般来说,操作一个对象,其内存地址属于另一个线程(例如,在线程的堆上创建的对象,但在另一个线程中使用)似乎很奇怪。

访问"外部"线程是否至少比操作"我自己的"对象慢,或者根本没有区别?

槽在调用(发出)信号的线程上串行调用。为简单起见,您可以将信号简单地视为一个插槽列表。一旦某个线程调用了a信号,就好像该线程在该列表上迭代并调用了每个连接的槽位。

提到你的第二个问题,线程并不真正"拥有"从它分配的东西。内存和对象所有权是根据管理代码的方式来决定的。一般来说,任何线程都可以访问它的进程内存空间中的任何内存地址,只要你设法给它传递一个有效的地址到那个位置。