2012-10-31 25 views
11

यह पिछले प्रश्न (here) से एक फॉलो-ऑन है, लेकिन मैं एक बहुप्रचारित एप्लिकेशन पर काम कर रहा हूं और मैं एक बूस्ट packed_task को थ्रेडेड io_service पर पोस्ट करना चाहता हूं। मैं एक सी ++ 03 कंपाइलर का उपयोग कर अटक गया हूं (इसलिए std :: move बाहर है), और packaged_task कॉपी करने योग्य नहीं है। मैंने इसे एक shared_ptr में लपेटने और उसे पार करने की कोशिश की है, और कई अन्य चीजें हैं। यहां मेरा वर्तमान प्रयास और बाद में संकलक त्रुटियां हैं। कोई विचार यह कैसे काम करने के लिए मिलता है?सी ++ 03 में किसी io_service पर boost packaged_task को आप कैसे पोस्ट करते हैं?

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(); 
} 

इस में जो परिणाम:

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>]’ 

बढ़ावा :: चाल (कार्य) का परिणाम दो त्रुटियों में उपयोग करते हुए:

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> >)()’ 
+0

कौन सा बूस्ट संस्करण उपयोग करते हैं? – Rost

+1

1.50 बूस्ट :: चाल (कार्य) में काम करना चाहिए। –

+0

@ रोस्ट, @ इगोरआर।, मैं 1.4 9 का उपयोग कर रहा था, अब 1.51 का उपयोग कर रहा हूं और मुझे अभी भी बूस्ट :: चाल (कार्य) का उपयोग करते समय निम्न त्रुटि मिलती है: '../boost_1_51_0/boost/asio/handler_invoke_hook.hpp:64: 3: त्रुटि: कॉल के लिए कोई मिलान नहीं '(boost :: detail :: thread_move_t >)()' 'कोई विचार? –

उत्तर

14

boost::packaged_task बूस्ट संस्करण 1.50 के बाद से समर्थन करता है, boost::move, इसी ticket देखना ।

लेकिन समस्या यह है कि io_service::post पूरा होने वाला हैंडलर पैरामीटर CopyConstructible होना चाहिए जैसा कि Asio handler requirements में उल्लेख किया गया है। इसलिए boost::packaged_task सीधे या चलकर पोस्ट नहीं किया जा सकता है। (इस मुद्दे के लिए Igor R. पर धन्यवाद)।

पॉइंटर्स का उपयोग करके कामकाज है, उदा। आप boost::shared_ptr साथ boost::packaged_task लपेट और 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)); 
+0

साझा पॉइंटर पर आपके काम-बाध्यकारी ऑपरेटर() के आसपास काम किया। बहुत बहुत धन्यवाद इसके साथ आपकी मदद! –

+0

मुझे यह जानने में बहुत दिलचस्पी होगी कि वीसी ++ 10 का उपयोग करने वाले लोगों के लिए यह मेल कैसे है। साझा किए गए पैकेज-कार्य पॉज़िक्स (मैक क्लैंग और लिनक्स जीसीसी) पर ठीक काम करते हैं, मुझे विंडोज़ पर बहुत अजीब त्रुटियां मिलती हैं -> 'सदस्य फ़ंक्शन पहले ही परिभाषित या घोषित किया गया है' –

+0

@BenJ मैंने बूस्ट 1.53 का उपयोग करके इस कोड को वीसी -2010 पर संकलित किया है और यह संकलित करता है और ठीक काम करता है (भविष्य में एच 4 9 13 चेतावनी को छोड़कर लेकिन यह बूस्ट मुद्दा ज्ञात है)। कृपया अपना वास्तविक कोड पोस्ट करें? – Rost