执行的槽位在哪个线程中?

时间:2016-09-16 00:49:53

标签: c++ multithreading boost-signals2

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

线程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上执行的,因为有信号被发出(并且调用是同步的),但对我来说执行函数的线程或者在general,操作一个对象,其内存地址属于另一个线程(例如,在线程堆上创建但在另一个线程中使用的对象)。

访问" foreigns"线程,至少,慢于操纵"我自己的"对象,或者根本没有差异?

1 个答案:

答案 0 :(得分:0)

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

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