2011-11-28 11 views
28

Ho riscontrato un problema utilizzando la nuova interfaccia C++ 11 std::thread.
Non riesco a capire come passare un riferimento a std::ostream alla funzione che verrà eseguita dal thread.Perché gli argomenti di riferimento dell'oggetto di passaggio alla funzione di thread non riescono a compilare?

Ecco un esempio con passando un intero (compilare e lavorare come previsto sotto gcc 4.6):

void foo(int &i) { 
    /** do something with i **/ 
    std::cout << i << std::endl; 
} 

int k = 10; 
std::thread t(foo, k); 

ma quando provo il superamento di un ostream non si compila:

void foo(std::ostream &os) { 
    /** do something with os **/ 
    os << "This should be printed to os" << std::endl; 
} 

std::thread t(foo, std::cout); 

C'è un modo per fare proprio questo, o non è affatto possibile ??

NB: dal errore di compilazione che sembra provenire da un costruttore cancellato ...

+0

Per le primitive: http://stackoverflow.com/questions/5116756/difference-between-pointer-and-reference-as-thread-parameter –

risposta

44

discussioni copia loro argomenti (si pensi a questo proposito, che è la cosa giusta). Se si desidera un riferimento in modo esplicito, è necessario avvolgerlo con std::ref (o std::cref per i riferimenti costanti):.

std::thread t(foo, std::ref(std::cout)); 

(Il wrapper di riferimento è un wrapper con semantica di valore intorno a un riferimento che è, si può copia il wrapper e tutte le copie conterranno lo stesso riferimento)

Come al solito, questo codice è corretto solo finché l'oggetto a cui si fa riferimento rimane attivo. Caveat emptor.

+2

O possibilmente passando per puntatore? –

+21

@JohnDibling: Se sei un masochista e credi che ci sia troppo plusplus nella tua C, sì. –

+0

Ho delle tendenze masochiste, immagino. –

-3
void foo(intstd::ostream &os) 

non sembra un C++ valido per me.

+7

Mi sembra valido ... Solo namespace insolito: P – AkiRoss

Problemi correlati