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 World
或Hello Foo World
或World Foo Hello
或Foo
和插槽之间的任何插入。插槽可以异步执行吗?以上是关于boost::signals 插槽是同步调用还是异步调用?的主要内容,如果未能解决你的问题,请参考以下文章