boost::signals 插槽是同步调用还是异步调用?

Posted

技术标签:

【中文标题】boost::signals 插槽是同步调用还是异步调用?【英文标题】:Are boost::signals slots called synchronously or asynchronously? 【发布时间】:2013-02-08 12:15:00 【问题描述】:

谁能告诉我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() 以未定义的顺序执行)?

【问题讨论】:

【参考方案1】:

在Boost.Signals 中,槽被同步调用,连接到同一信号的槽按照它们被添加的顺序被调用。这也适用于线程安全变体Boost.Signals2

【讨论】:

这里的文档似乎另有说明:boost.org/doc/libs/1_54_0/doc/html/signals2/… 你是对的。我确信没有指定顺序,但是文档的那部分在最近的四五个版本中没有改变。我更正了我的答案。【参考方案2】:

这应该打印“Hello World Foo”,但可以合法地打印“World Hello Foo”,因为调用多个连接的插槽的顺序未定义 AFAIK。

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

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

【讨论】:

我明白,但我需要知道是否有机会打印Foo Hello WorldHello Foo WorldWorld Foo HelloFoo 和插槽之间的任何插入。插槽可以异步执行吗?

以上是关于boost::signals 插槽是同步调用还是异步调用?的主要内容,如果未能解决你的问题,请参考以下文章

boost--signal

如何使用 boost::signals2 存储和转发插槽?

从 boost::signals2 安全断开

使用 Visual Studio 库中的“信号”

使用 boost::signals2 的编译时间非常慢

在地图中存储 boost::signals2 信号?