【发布时间】:2012-06-11 18:33:04
【问题描述】:
我正在尝试使用std::packaged_task 在线程中启动一个函数
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:再次更新代码以修复错误并包含完整的错误消息。
g++-4.6(在 Ubuntu 10.04 上)无法编译代码:
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
我读到这可能是由于一个错误:gcc-mailinglist
我是 C++/C++11 的新手 - 有什么好的替代方案?我只需要启动一个给我未来的线程,稍后在boost::asio 异步循环中调用get()-method。
【问题讨论】:
-
一个问题是您已将 packaged_task 声明为不带参数并返回 SearchResults,但 lambda 只带一个参数。我希望你的声明是
std::packaged_task<SearchResults(Query&)> -
你真的可以发布完整的错误信息吗?看来你只发布了一半。这让人难以理解。
-
我已更改代码以反映缺少的参数,并使用更新的代码添加了完整的错误消息。还有很多问题。
标签: c++ concurrency c++11 g++ std