2013-02-08 95 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