2

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

线程1:管理一个boost::signals2对象。调用它s

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

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

线程 4:管理对s, 和emits 信号的引用。

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

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

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

4

1 回答 1

0

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

关于您的第二个问题,线程并不真正“拥有”从中分配的内容。内存和对象所有权是您根据管理代码的方式确定的。通常,只要您设法将有效地址传递给该位置,任何线程都可以访问其进程内存空间上的任何内存地址。

于 2018-05-07T18:05:26.943 回答