是boost::信号槽被同步或异步调用

Are boost::signals slots called synchronously or asynchronously?

本文关键字:异步 同步 调用 boost 信号      更新时间:2023-10-16

有人能告诉我boost::signals插槽是同步调用的还是异步调用的吗?

例如,我有一段代码:

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();
cout << "Foo";

执行线程是如何工作的?执行是等待Hello()World()执行,然后打印"Foo",还是异步调用它们(打印"Foo"并调用Hello()World()以未定义的顺序执行)?

在Boost中。信号槽被同步调用,连接到同一信号的槽按添加顺序调用。线程安全变体Boost.Signals2 也是如此

这应该打印"Hello World Foo",但可以合法打印"World Hello Foo"因为对多个连接插槽的调用顺序没有定义为AFAIK。

如果您想要严格的订单,请使用以下语法:

sig.connect(1, World());
sig.connect(0, Hello());