你如何张贴提振packaged_task在C ++ 03的io_service对象? [英] How do you post a boost packaged_task to an io_service in C++03?

查看:192
本文介绍了你如何张贴提振packaged_task在C ++ 03的io_service对象?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是一个后续从previous问题(<一个href=\"http://stackoverflow.com/questions/13146433/boostasio-thread-pool-implementation-for-occasionally-synchronized-tasks\"标题=点击这里>这里),但我的工作多线程应用程序,我想一个升压packaged_task张贴到螺纹io_service对象。我使用插着C ++编译器03(这样的std ::招出),并且packaged_task是不可拷贝。我已经试过包装在一个shared_ptr的和传球的是,和很多其他的事情。这是我当前的尝试和随后的编译器错误。任何想法如何得到这个工作?

 的boost ::支持ASIO :: io_service对象io_service对象;
提高:: thread_group线程;
提高:: ASIO :: io_service对象::工作工作(io_service对象);
的for(int i = 0; I&LT; maxNumThreads ++ I)
{
    threads.create_thread(提高::绑定(安培;提高:: ASIO :: io_service对象::运行,
        &放大器; io_service对象));
}
的std ::矢量&lt;提高:: shared_future&LT;布尔&GT; &GT; pending_data;期货//矢量布尔process_data(INT,INT){...}
...对于(INT theTime = 0; theTime = totalScenarioTime;!++ theTime)
{
    的for(int i = 0; I&LT; numSmallTask​​s ++ I)
    {
        提高:: packaged_task&LT;布尔&GT;任务(提高::绑定(安培; process_data,我,theTime));
        提高:: shared_future&LT;布尔&GT; FUT(task.get_future());
        pending_data.push_back(FUT); // C ++ 11个可能:(性病::移动(FUT)时,FUT是一种unique_future);
        io_service.post(任务); // C ++ 11个可能:(性病::移动(任务));
    }
    //循环后 - 等到所有期货交易进行评估
    升压:: wait_for_all(pending_data.begin(),pending_data.end());
    pending_data.clear();
}

其结果是:

 在文件从../boostlibs/boost/asio/io_service.hpp:767:0包括,
             从../boostlibs/boost/asio/basic_io_object.hpp:19,
             从../boostlibs/boost/asio/basic_socket.hpp:19,
             从../boostlibs/boost/asio/basic_datagram_socket.hpp:20,
             从../boostlibs/boost/asio.hpp:20,
             从../main.cpp:13:
../boostlibs/boost/asio/impl/io_service.hpp:在成员函数'无效的boost ::支持ASIO :: io_service对象::后(常量CompletionHandler&安培;)与CompletionHandler =的boost :: packaged_task&LT;布尔]的计算值:
../main.cpp:256:23:从这里实例化
../boostlibs/boost/asio/impl/io_service.hpp:95:67:错误:调用没有匹配的函数的boost :: packaged_task&LT;布尔&GT; :: packaged_task(常量的boost :: packaged_task&LT;布尔&GT;&安培;)
../boostlibs/boost/asio/impl/io_service.hpp:95:67:注意:考生:
../boostlibs/boost/thread/future.hpp:1372:9:注意: boost::packaged_task<R>::packaged_task(boost::detail::thread_move_t<boost::packaged_task<R> &GT;)与R = BOOL]
../boostlibs/boost/thread/future.hpp:1372:9:注意:从参数1没有已知的转换常量的boost :: packaged_task&LT;布尔&GT;'到'的boost ::详细:: thread_move_t&LT;提高:: packaged_task&LT ;布尔&GT; &GT;'
../boostlibs/boost/thread/future.hpp:1318:9:注:升压:: packaged_task&LT; R&GT; :: packaged_task()与R = BOOL]
../boostlibs/boost/thread/future.hpp:1318:9:注意:考生预计0参数,提供了1
../boostlibs/boost/thread/future.hpp:1314:9:注:升压:: packaged_task&LT; R&GT; :: packaged_task(升压:: packaged_task&LT; R&GT;&安培;)与R = BOOL,提振:: packaged_task&LT ; R GT; =提振:: packaged_task&LT;布尔&GT;]
../boostlibs/boost/thread/future.hpp:1314:9:注意:从参数1没有已知的转换常量的boost :: packaged_task&LT;布尔&GT;'到'的boost :: packaged_task&LT;布尔&GT;&放大器;'
../boostlibs/boost/asio/detail/handler_type_requirements.hpp:95:26:错误:初始化T&放'的说法1;提高:: ASIO ::详细:: LVREF(T)与T =的boost :: packaged_task&LT;布尔&GT;]
../boostlibs/boost/asio/impl/io_service.hpp:95:67:错误:调用没有匹配的函数的boost :: packaged_task&LT;布尔&GT; :: packaged_task(常量的boost :: packaged_task&LT;布尔&GT;&安培;)
../boostlibs/boost/asio/impl/io_service.hpp:95:67:注意:考生:
../boostlibs/boost/thread/future.hpp:1372:9:注意: boost::packaged_task<R>::packaged_task(boost::detail::thread_move_t<boost::packaged_task<R> &GT;)与R = BOOL]
../boostlibs/boost/thread/future.hpp:1372:9:注意:从参数1没有已知的转换常量的boost :: packaged_task&LT;布尔&GT;'到'的boost ::详细:: thread_move_t&LT;提高:: packaged_task&LT ;布尔&GT; &GT;'
../boostlibs/boost/thread/future.hpp:1318:9:注:升压:: packaged_task&LT; R&GT; :: packaged_task()与R = BOOL]
../boostlibs/boost/thread/future.hpp:1318:9:注意:考生预计0参数,提供了1
../boostlibs/boost/thread/future.hpp:1314:9:注:升压:: packaged_task&LT; R&GT; :: packaged_task(升压:: packaged_task&LT; R&GT;&安培;)与R = BOOL,提振:: packaged_task&LT ; R GT; =提振:: packaged_task&LT;布尔&GT;]
../boostlibs/boost/thread/future.hpp:1314:9:注意:从参数1没有已知的转换常量的boost :: packaged_task&LT;布尔&GT;'到'的boost :: packaged_task&LT;布尔&GT;&放大器;'
../boostlibs/boost/asio/detail/handler_type_requirements.hpp:96:32:错误:初始化的常量T&放大器参数1;提高:: ASIO ::详细:: clvref(T)与T =的boost :: packaged_task&LT;布尔&GT;]
../boostlibs/boost/asio/impl/io_service.hpp:97:3:错误:调用没有匹配的函数的boost :: packaged_task&LT;布尔&GT; :: packaged_task(常量的boost :: packaged_task&LT;布尔&GT;&安培;)
../boostlibs/boost/asio/impl/io_service.hpp:97:3:注意:考生:
../boostlibs/boost/thread/future.hpp:1372:9:注意: boost::packaged_task<R>::packaged_task(boost::detail::thread_move_t<boost::packaged_task<R> &GT;)与R = BOOL]
../boostlibs/boost/thread/future.hpp:1372:9:注意:从参数1没有已知的转换常量的boost :: packaged_task&LT;布尔&GT;'到'的boost ::详细:: thread_move_t&LT;提高:: packaged_task&LT ;布尔&GT; &GT;'
../boostlibs/boost/thread/future.hpp:1318:9:注:升压:: packaged_task&LT; R&GT; :: packaged_task()与R = BOOL]
../boostlibs/boost/thread/future.hpp:1318:9:注意:考生预计0参数,提供了1
../boostlibs/boost/thread/future.hpp:1314:9:注:升压:: packaged_task&LT; R&GT; :: packaged_task(升压:: packaged_task&LT; R&GT;&安培;)与R = BOOL,提振:: packaged_task&LT ; R GT; =提振:: packaged_task&LT;布尔&GT;]
../boostlibs/boost/thread/future.hpp:1314:9:注意:从参数1没有已知的转换常量的boost :: packaged_task&LT;布尔&GT;'到'的boost :: packaged_task&LT;布尔&GT;&放大器;'
../boostlibs/boost/asio/detail/impl/task_io_service.hpp:54:6:错误:初始化的无效的boost ::支持ASIO ::详细:: task_io_service ::后(处理器)参数1 [与处理程序=提振:: packaged_task&LT;布尔&GT;]

使用boost ::移动(任务),导致两个错误:

 错误:不对应的呼叫'(的boost ::详细:: thread_move_t&LT;提高:: packaged_task&LT;布尔&GT;&GT;)()
错误:不对应的呼叫'(的boost ::详细:: thread_move_t&LT;提高:: packaged_task&LT;布尔&GT;&GT;)()


解决方案

的boost :: packaged_task 支持的boost ::移动自升压版本1.50,请参阅相应的

但问题是,<一href=\"http://www.boost.org/doc/libs/1_51_0/doc/html/boost_asio/reference/io_service/post.html\"><$c$c>io_service::post完成处理程序参数必须是复制构造中的Asio处理要求。因此,的boost :: packaged_task 不能直接或者通过移动公布。 (感谢伊戈尔R. 了解这个问题)。

有解决方法是使用指针,例如你可以换的boost :: packaged_task 的boost :: shared_ptr的并将其绑定到操作符( )

 的typedef的boost :: packaged_task&LT;布尔&GT; task_t;
 提高:: shared_ptr的&LT; task_t&GT;任务=的boost :: make_shared&LT; task_t&GT;(
    提高::绑定(安培; process_data,我,theTime)); io_service.post(升压::绑定(安培; task_t ::运算符(),任务));

This is a follow-on from a previous question (here), but I'm working on a multithreaded application and I would like to post a Boost packaged_task to a threaded io_service. I'm stuck using a C++03 compiler (so std::move is out), and the packaged_task is not copyable. I've tried wrapping it in a shared_ptr and passing that, and a lot of other things. Here is my current attempt and the subsequent compiler errors. Any idea how to get this to work?

boost::asio::io_service io_service;
boost::thread_group threads;
boost::asio::io_service::work work(io_service);
for (int i = 0; i < maxNumThreads; ++i)
{
    threads.create_thread(boost::bind(&boost::asio::io_service::run,
        &io_service));
}
std::vector<boost::shared_future<bool> > pending_data; // vector of futures

bool process_data(int,int){...}
...

for(int theTime = 0; theTime != totalScenarioTime; ++theTime)
{
    for(int i = 0; i < numSmallTasks; ++i)
    {
        boost::packaged_task<bool> task(boost::bind(&process_data,i,theTime));
        boost::shared_future<bool> fut(task.get_future());
        pending_data.push_back(fut); // C++11 possible: (std::move(fut) when fut is a unique_future);
        io_service.post(task); // C++11 possible: (std::move(task));    
    }
    // After loop - wait until all futures are evaluated
    boost::wait_for_all(pending_data.begin(), pending_data.end()); 
    pending_data.clear();
}

This results in:

In file included from ../boostlibs/boost/asio/io_service.hpp:767:0,
             from ../boostlibs/boost/asio/basic_io_object.hpp:19,
             from ../boostlibs/boost/asio/basic_socket.hpp:19,
             from ../boostlibs/boost/asio/basic_datagram_socket.hpp:20,
             from ../boostlibs/boost/asio.hpp:20,
             from ../main.cpp:13:
../boostlibs/boost/asio/impl/io_service.hpp: In member function ‘void boost::asio::io_service::post(const CompletionHandler&) [with CompletionHandler = boost::packaged_task<bool>]’:
../main.cpp:256:23:   instantiated from here
../boostlibs/boost/asio/impl/io_service.hpp:95:67: error: no matching function for call to ‘boost::packaged_task<bool>::packaged_task(const boost::packaged_task<bool>&)’
../boostlibs/boost/asio/impl/io_service.hpp:95:67: note: candidates are:
../boostlibs/boost/thread/future.hpp:1372:9: note: boost::packaged_task<R>::packaged_task(boost::detail::thread_move_t<boost::packaged_task<R> >) [with R = bool]
../boostlibs/boost/thread/future.hpp:1372:9: note:   no known conversion for argument 1 from ‘const boost::packaged_task<bool>’ to ‘boost::detail::thread_move_t<boost::packaged_task<bool> >’
../boostlibs/boost/thread/future.hpp:1318:9: note: boost::packaged_task<R>::packaged_task() [with R = bool]
../boostlibs/boost/thread/future.hpp:1318:9: note:   candidate expects 0 arguments, 1 provided
../boostlibs/boost/thread/future.hpp:1314:9: note: boost::packaged_task<R>::packaged_task(boost::packaged_task<R>&) [with R = bool, boost::packaged_task<R> = boost::packaged_task<bool>]
../boostlibs/boost/thread/future.hpp:1314:9: note:   no known conversion for argument 1 from ‘const boost::packaged_task<bool>’ to ‘boost::packaged_task<bool>&’
../boostlibs/boost/asio/detail/handler_type_requirements.hpp:95:26: error:   initializing argument 1 of ‘T& boost::asio::detail::lvref(T) [with T = boost::packaged_task<bool>]’
../boostlibs/boost/asio/impl/io_service.hpp:95:67: error: no matching function for call to ‘boost::packaged_task<bool>::packaged_task(const boost::packaged_task<bool>&)’
../boostlibs/boost/asio/impl/io_service.hpp:95:67: note: candidates are:
../boostlibs/boost/thread/future.hpp:1372:9: note: boost::packaged_task<R>::packaged_task(boost::detail::thread_move_t<boost::packaged_task<R> >) [with R = bool]
../boostlibs/boost/thread/future.hpp:1372:9: note:   no known conversion for argument 1 from ‘const boost::packaged_task<bool>’ to ‘boost::detail::thread_move_t<boost::packaged_task<bool> >’
../boostlibs/boost/thread/future.hpp:1318:9: note: boost::packaged_task<R>::packaged_task() [with R = bool]
../boostlibs/boost/thread/future.hpp:1318:9: note:   candidate expects 0 arguments, 1 provided
../boostlibs/boost/thread/future.hpp:1314:9: note: boost::packaged_task<R>::packaged_task(boost::packaged_task<R>&) [with R = bool, boost::packaged_task<R> = boost::packaged_task<bool>]
../boostlibs/boost/thread/future.hpp:1314:9: note:   no known conversion for argument 1 from ‘const boost::packaged_task<bool>’ to ‘boost::packaged_task<bool>&’
../boostlibs/boost/asio/detail/handler_type_requirements.hpp:96:32: error:   initializing argument 1 of ‘const T& boost::asio::detail::clvref(T) [with T = boost::packaged_task<bool>]’
../boostlibs/boost/asio/impl/io_service.hpp:97:3: error: no matching function for call to ‘boost::packaged_task<bool>::packaged_task(const boost::packaged_task<bool>&)’
../boostlibs/boost/asio/impl/io_service.hpp:97:3: note: candidates are:
../boostlibs/boost/thread/future.hpp:1372:9: note: boost::packaged_task<R>::packaged_task(boost::detail::thread_move_t<boost::packaged_task<R> >) [with R = bool]
../boostlibs/boost/thread/future.hpp:1372:9: note:   no known conversion for argument 1 from ‘const boost::packaged_task<bool>’ to ‘boost::detail::thread_move_t<boost::packaged_task<bool> >’
../boostlibs/boost/thread/future.hpp:1318:9: note: boost::packaged_task<R>::packaged_task() [with R = bool]
../boostlibs/boost/thread/future.hpp:1318:9: note:   candidate expects 0 arguments, 1 provided
../boostlibs/boost/thread/future.hpp:1314:9: note: boost::packaged_task<R>::packaged_task(boost::packaged_task<R>&) [with R = bool, boost::packaged_task<R> = boost::packaged_task<bool>]
../boostlibs/boost/thread/future.hpp:1314:9: note:   no known conversion for argument 1 from ‘const boost::packaged_task<bool>’ to ‘boost::packaged_task<bool>&’
../boostlibs/boost/asio/detail/impl/task_io_service.hpp:54:6: error:   initializing argument 1 of ‘void boost::asio::detail::task_io_service::post(Handler) [with Handler = boost::packaged_task<bool>]’

Using boost::move(task) results in the two errors:

error: no match for call to ‘(boost::detail::thread_move_t<boost::packaged_task<bool> >) ()’
error: no match for call to ‘(boost::detail::thread_move_t<boost::packaged_task<bool> >) ()’

解决方案

boost::packaged_task supports boost::move since Boost version 1.50, see corresponding ticket.

But the problem is that io_service::post completion handler parameter must be CopyConstructible as noted in Asio handler requirements. Therefore boost::packaged_task cannot be posted directly or by moving. (Thanks to Igor R. for this issue).

There is workaround using pointers, e.g. you could wrap boost::packaged_task with boost::shared_ptr and bind it to operator():

 typedef boost::packaged_task<bool> task_t;
 boost::shared_ptr<task_t> task = boost::make_shared<task_t>(
    boost::bind(&process_data, i, theTime));

 io_service.post(boost::bind(&task_t::operator(), task));

这篇关于你如何张贴提振packaged_task在C ++ 03的io_service对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆