2013-02-08 67 views
5

任何人都可以告诉我是boost::signals同步或异步调用的插槽吗?boost :: signals slots是同步调用还是异步调用?

比如我有这段代码:

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

回答

7

Boost.Signals时隙同步调用,并连接到同一个信号时隙被称为在它们被添加的顺序。这也适用于线程安全版本Boost.Signals2

+1

Docs在这里似乎是另有说明:http://www.boost.org/doc/libs/1_54_0/doc/html/signals2/tutorial.html#idp164798944 – sje397 2013-08-26 03:44:32

+1

你说得对。我确信订单没有具体说明,但是在最近的四个或五个版本中,这部分文档没有改变。我纠正了我的答案。 – 2013-08-26 07:49:57

0

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

如果你想严格的顺序使用此语法:

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

我明白了,但是我需要知道的是,如果有机会打印“Foo Hello World”或“Hello Foo World”或“World Foo Hello”或任何其他插入'Foo'和插槽之间。插槽是否可以异步执行? – 2013-02-08 12:51:11