Boost库中的信号和插槽与多线程

Lil*_*ily 5 c++ multithreading boost signals-slots

我在Stackoverflow上经历了类似的问题,但仍然无法得到很好的答案:

  1. Boost如何实现信号和插槽
  2. 信号和插槽的实现方式

我对如何实现此信号/插槽感到非常困惑。

Q1:从下面的代码,sig连接到两个函数(Hello()和World()),似乎这些函数是以序列化的方式调用的,这还意味着一个函数(Hello())需要在进入另一个函数(World())之前完成?=>单线程程序

Q2:反正有启用多线程信号/插槽吗?(=> World()将立即启动,不需要等待Hello()完成。)或者,如果不建议这样做,您可以告诉我为什么?

Boost网站上的示例代码

struct Hello 
{
  void operator()() const { std::cout << "Hello";}
};
struct World
{
  void operator()() const { std::cout << ", World!" << std::endl;}
};

boost::signal<void ()> sig;
sig.connect(Hello());
sig.connect(World());
sig();
Run Code Online (Sandbox Code Playgroud)

输出:世界,您好!

Geo*_*che 5

Q1:
调用是串行的。信号在内部所做的事情被大大简化了:

foreach connection:
  call handler
Run Code Online (Sandbox Code Playgroud)

因此,您不想长时间阻塞处理程序。如果您需要做很多工作,您可以从那里调用它,例如为其创建一个线程。

Q2:
Boost 信号 1 甚至不是线程安全的;信号 2 是,但仍然进行序列化调用。由于信号主要用于事件处理,因此在处理程序中实际上不做太多工作是常见的风格。
因此,“并行”调用它们并没有真正的好处,这些好处通常不会证明必要的线程调用的开销是合理的。