Vorbei Objekt über eine Referenz auf std::thread in C++11
Warum kann man nicht ein Objekt übergeben durch Referenz beim erstellen einer std::thread
?
Zum Beispiel den folgenden snippit gibt einen compile-Fehler:
#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;
}
Fehler:
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...>)
^
Habe ich geändert, wird ein Zeiger übergeben, aber gibt es eine bessere Lösung?
InformationsquelleAutor austinmarton | 2015-12-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Explizit initialisiert das Faden mit einem
reference_wrapper
mit, std::ref
:(oder
std::cref
stattstd::ref
als geeignet). Pro Noten von cppreference aufstd:thread
:Ausgezeichnet! Ich hatte gehofft, es war ein Weg, um explizit übergeben Sie einen Verweis. C++11 ist die Rettung wieder 🙂
InformationsquelleAutor ShadowRanger
Basierend auf dieser Kommentar, diese Antwort näher auf den Grund, warum die Argumente nicht übergeben durch Verweis an die thread-Funktion standardmäßig.
Betrachten Sie die folgende Funktion
SimpleThread()
:Nun, sich vorstellen, was passieren würde, wenn Sie den folgenden code zusammengestellt (es tut nicht kompilieren):
Dem argument
a
übergeben werden würde durch Verweis aufSimpleThread()
. Der thread kann noch schlafen in der FunktionSimpleThread()
nach der variablea
hat bereits erloschen, der Geltungsbereich und die Lebensdauer zu Ende ist. Wenn dem so ist,i
imSimpleThread()
wäre eigentlich eine baumelnden Referenz, und die Zuordnungi = 0
führen würde Undefiniertes Verhalten.Durch die Verpackung Referenz-Argumente mit der Vorlage-Klasse
std::reference_wrapper
(über die Funktion Vorlagenstd::ref
undstd::cref
) Sie ausdrücklich Ihre Absichten.InformationsquelleAutor El Profesor