C++ 插槽在哪个线程中执行?

C++ 插槽在哪个线程中执行?,c++,multithreading,boost-signals2,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的引用,并发出信号 插槽在哪里执行?它们都在线程4中,emit调用发生在哪里?在线程1上,因为那是信号内存地址的线程?或者每个插槽在其对应的线程(2和3)上执行 最明显的是插槽是通过线程4执行的,

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

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

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

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

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

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

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


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

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


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

Unlike Qt的信号和插槽实现,
boost::signals2
没有任何类型的消息循环,因此它无法将工作发布到另一个线程。插槽在发出信号的线程上执行。如果确实希望某个特定插槽在另一个线程上运行,则需要某种类型的工作队列。这可能是一个不错的选择。内存不是由任何特定线程拥有。任何给定线程访问另一个线程的堆栈或堆上由另一个线程分配的对象都没有问题。这种共享内存空间会使执行线程变得困难,因为它会使您面临恐惧。@SeanCline如果您的注释是一个答案,我会选择它作为有效答案。@SeanCline不是一个线程“拥有”的吗?我想说一个
thread\u local
变量只是一个全局变量,但是每个线程有不同的内存地址(因此,每个
thread\u local
变量名绑定到每个线程中不同的内存地址)。我想你还可以传递那个地址(通过指针或引用)因此,一个线程可以操作一个外来的
thread\u local
变量。