Passing object by reference to std::thread in C++11

c++, c++11, multithreading, pass-by-reference, stdthread

Solution

Explicitly initialize the thread with a `reference_wrapper` by using `std::ref`:

auto thread1 = std::thread(SimpleThread, std::ref(a));

(or `std::cref` instead of `std::ref`, as appropriate). Per notes from cppreference on `std:thread`:

The arguments to the thread function are moved or copied by value. If a reference argument needs to be passed to the thread function, it has to be wrapped (e.g. with `std::ref` or `std::cref`).

Problem

Why can't you pass an object by reference when creating a `std::thread` ? For example the following snippit gives a compile error: ``` #include <iostream> #include <thread> using namespace std; static void SimpleThread(int& a) // compile error //static void SimpleThread(int a) // OK { cout << __PRETTY_FUNCTION__ << ":" << a << endl; } int main() { int a = 6; auto thread1 = std::thread(SimpleThread, a); thread1.join(); return 0; } ``` Error: ``` In file included from /usr/include/c++/4.8/thread:39:0, from ./std_thread_refs.cpp:5: /usr/include/c++/4.8/functional: In instantiation of ‘struct std::_Bind_simple<void (*(int))(int&)>’: /usr/include/c++/4.8/thread:137:47: required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (&)(int&); _Args = {int&}]’ ./std_thread_refs.cpp:19:47: required from here /usr/include/c++/4.8/functional:1697:61: error: no type named ‘type’ in ‘class std::result_of<void (*(int))(int&)>’ typedef typename result_of<_Callable(_Args...)>::type result_type; ^ /usr/include/c++/4.8/functional:1727:9: error: no type named ‘type’ in ‘class std::result_of<void (*(int))(int&)>’ _M_invoke(_Index_tuple<_Indices...>) ^ ``` I've changed to passing a pointer, but is there a better work around?

Original source