I've come to a problem using the new c++11 std::thread
interface.
I can't figure out how to pass a reference to a std::ostream
to the function that the thread will execute.
Here's an example with passing an integer(compile and work as expected under gcc 4.6) :
void foo(int &i) { /** do something with i **/ std::cout << i << std::endl; } int k = 10; std::thread t(foo, k);
But when I try passing an ostream it does not compile :
void foo(std::ostream &os) { /** do something with os **/ os << "This should be printed to os" << std::endl; } std::thread t(foo, std::cout);
Is there a way to do just that, or is it not possible at all ??
NB: from the compile error it seems to come from a deleted constructor...
In c++11 to pass a referenceto a thread, we have std::ref(). std::thread t3(fun3, std::ref(x)); In this statement we are passing reference of x to thread t3 because fun3() takes int reference as a parameter. If we try to pass 'x' or '&x' it will throw a compile time error.
You can only pass a single argument to the function that you are calling in the new thread.
Threads copy their arguments (think about it, that's The Right Thing). If you want a reference explicitly, you have to wrap it with std::ref
(or std::cref
for constant references):
std::thread t(foo, std::ref(std::cout));
(The reference wrapper is a wrapper with value semantics around a reference. That is, you can copy the wrapper, and all copies will contain the same reference.)
As usual, this code is only correct as long as the object to which you refer remains alive. Caveat emptor.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With