2013-02-08 22 views
5

Kann mir jemand sagen, sind boost::signals Slots synchron oder asynchron aufgerufen?Werden boost :: signals Slots synchron oder asynchron aufgerufen?

Zum Beispiel habe ich dieses Stück Code:

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"; 

Wie funktioniert die Ausführungs-Thread Arbeit? Wartet die Ausführung auf Hello() und World(), um auszuführen und direkt danach "Foo" gedruckt wird oder ruft es asynchron (Drucken "Foo" und Aufrufen von Hello() und World() ausführen in einer undefinierten Reihenfolge)?

Antwort

7

In Boost.Signals Schlitze synchron und Schlitze mit dem gleichen Signal genannt werden in der Reihenfolge, in der sie hinzugefügt wurden genannt. Dies gilt auch für die thread-sichere Variante, Boost.Signals2

+1

Docs hier scheinen andere anzuzeigen: http://www.boost.org/doc/libs/1_54_0/doc/html/signals2/tutorial.html#idp164798944 – sje397

+1

Sie haben Recht. Ich war überzeugt, dass die Bestellung nicht spezifiziert wurde, aber dieser Teil der Dokumentation hat sich in den letzten vier oder fünf Versionen nicht geändert. Ich habe meine Antwort korrigiert. –

0

Dies sollte "Hello World Foo" drucken, aber könnte "World Hello Foo" legal drucken, weil die Reihenfolge der Aufrufe an mehrere verbundene Slots AFAIK nicht definiert ist.

Wenn Sie strenge Ordnung verwenden diese Syntax wollen:

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

Ich verstehe, aber was ich wissen muss, ist, wenn es eine Chance gibt, 'Foo Hello World' oder' Hallo Foo World 'oder' World Foo Hello' oder irgendwelche zu drucken Interkalation zwischen 'Foo' und den Slots. Können die Slots asynchron ausgeführt werden oder nicht? –

Verwandte Themen