2013-02-08 15 views
5

Qualcuno può dirmi sono gli slot boost::signals chiamati in modo sincrono o asincrono?Gli slot boost :: signal sono chiamati in modo sincrono o asincrono?

Per esempio io ho questo pezzo di codice:

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

Come funziona il thread di esecuzione? L'esecuzione attende Hello() e World() da eseguire e subito dopo viene stampato lo "Foo" o li chiama in modo asincrono (stampando "Foo" e chiamando Hello() e World() eseguiti in un ordine non definito)?

risposta

7

In Boost.Signals slot sono chiamati in modo sincrono e slot collegati alla stessa del segnale vengono chiamati nell'ordine in cui sono stati aggiunti. Questo vale anche per la variante thread-safe, Boost.Signals2

+1

I documenti qui sembrano indicare diversamente: http://www.boost.org/doc/libs/1_54_0/doc/html/signals2/tutorial.html#idp164798944 – sje397

+1

Hai ragione. Ero convinto che l'ordine non fosse specificato, ma quella parte della documentazione non è cambiata nelle ultime quattro o cinque versioni. Ho corretto la mia risposta. –

0

Questo dovrebbe stampare "Hello World Foo" ma potrebbe legalmente stampare "World Hello Foo" perché l'ordine delle chiamate a più slot connessi non è definito AFAIK.

Se volete rigoroso uso ordine questa sintassi:

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

Capisco, ma quello che ho bisogno di sapere è se c'è qualche possibilità di stampare "Foo Hello World" o "Hello Foo World" o "World Foo Hello" o qualsiasi intercalazione tra 'Foo' e le fessure. Gli slot possono essere eseguiti in modo asincrono o no? –

Problemi correlati