Sto cercando di lanciare una funzione in un thread utilizzando std::packaged_task
std :: packaged_task errore di compilazione w/gcc 4.6
Query query; /* protobuf object */
/* fill Query object */
std::packaged_task<SearchResults(Query&)> task([](Query& q) ->SearchResults {
index::core::Merger merger;
return merger.search(q);
});
std::future<SearchResults> ftr = task.get_future();
std::thread(std::move(task),query).detach();
Edit2: Aggiornato il codice nuovo per correggere gli errori e incluso il messaggio di errore completo.
g ++ - 4.6 (su Ubuntu 10.04) è in grado di compilare il codice:
In file included from /usr/include/c++/4.6/memory:80:0,
from ../src/net/QueryConnection.cpp:8:
/usr/include/c++/4.6/functional: In instantiation of ‘std::_Bind_result<void,
std::packaged_task<SearchResults(Query&)>(Query)>’:
/usr/include/c++/4.6/thread:135:9: instantiated from ‘std::thread::thread(_Callable&&,
_Args&& ...) [with _Callable = std::packaged_task<SearchResults(Query&)>, _Args =
{Query&}]’
../src/net/QueryConnection.cpp:77:36: instantiated from here
/usr/include/c++/4.6/functional:1365:7: error: ‘std::_Bind_result<_Result,
_Functor(_Bound_args ...)>::_Bind_result(const std::_Bind_result<_Result,
_Functor(_Bound_args ...)>&) [with _Result = void, _Functor =
std::packaged_task<SearchResults(Query&)>, _Bound_args = {Query},
std::_Bind_result<_Result, _Functor(_Bound_args ...)> = std::_Bind_result<void,
std::packaged_task<SearchResults(Query&)>(Query)>]’ declared to take const reference,
but implicit declaration would take non-const
Build error occurred, build is stopped
ho letto che questo è forse a causa di un bug: gcc-mailinglist
Sono nuovo di C++/C++ 11 - Quale sarebbe una buona alternativa di lavoro? Ho solo bisogno di avviare una discussione che mi dà un futuro, il cui metodo get()
viene chiamato più tardi in un ciclo asincrono boost::asio
.
Un problema è che hai dichiarato che il pacchetto_packaged non accetta argomenti e restituisce un SearchResults, ma lambda accetta un singolo argomento. Mi aspetto che la tua dichiarazione sia 'std :: packageaged_task' –
Puoi davvero pubblicare il messaggio di errore completo? Sembra che tu abbia postato solo la metà. Ciò lo rende inintelligibile. –
Ho modificato il codice per riflettere l'argomento mancante e ho aggiunto il messaggio di errore completo con il codice aggiornato. Ancora un sacco di problemi. –