2012-06-07 14 views
5

मैं एक सूत्र में एक समारोह के शुरू करने के लिए कोशिश कर रहा हूँ का उपयोग कर std::packaged_taskstd :: packaged_task संकलन त्रुटि डब्ल्यू/जीसीसी 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: कोड फिर से अपडेट किया गया त्रुटियों को ठीक करने और पूर्ण त्रुटि संदेश भी शामिल थे।

जी ++ - 4.6 (उबंटू 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

मैं सी के लिए नया हूँ ++/सी ++ 11 - एक अच्छा कामकाजी विकल्प क्या होगा? मुझे बस एक धागा लॉन्च करने की ज़रूरत है जो मुझे भविष्य देता है, जिसे get() -method को बाद में boost::asio एसिंक लूप में कहा जाता है।

+0

एक समस्या यह है कि आपने पैकेज किए गए_टास्क को कोई तर्क नहीं लेने और सर्च रिसेट्स लौटने के रूप में घोषित कर दिया है, लेकिन लैम्ब्डा एक भी तर्क लेता है। मैं आपकी घोषणा 'std :: packaged_task ' –

+0

होने की अपेक्षा करता हूं क्या आप वास्तव में पूर्ण त्रुटि संदेश पोस्ट कर सकते हैं? ऐसा लगता है कि आपने इसका केवल आधा हिस्सा पोस्ट किया है। इससे यह अनजान हो जाता है। –

+0

मैंने लापता तर्क को दर्शाने के लिए कोड बदल दिया है और अद्यतन कोड के साथ पूर्ण त्रुटि संदेश जोड़ा है। अभी भी बहुत सारी समस्या है। –

उत्तर

3

यह जीसीसी 4.6 में एक बग है (वास्तव में सी ++ 11 मानक में defect) जिसे मैंने पहले ही 4.7 में तय कर लिया है।

समाधान के लिए आप उपयोग कर सकते std::async

Query query; 
std::future<SearchResults> ftr = std::async([](Query& q) ->SearchResults { 
     index::core::Merger merger; 
     return merger.search(q); 
    }, query); 

यह जीसीसी 4.6 के साथ ठीक काम करता है, और अधिक आसान और सुरक्षित है कि एक packaged_task बनाने और एक अलग धागे में यह वैसे भी चल रहा है।

+0

धन्यवाद! यह काम! –

1

मुझे नहीं पता कि ये जीसीसी की त्रुटियों का कारण हैं या नहीं, लेकिन फिर भी वे समस्याग्रस्त हैं।

[=](Query& q){ 
     index::core::Merger merger; 
     return merger.search(q); 
} 

के बाद से इस लैम्ब्डा एक भी वापसी कथन है, और कोई स्पष्ट वापसी प्रकार शामिल नहीं है दिया गया था, यह एक void वापसी प्रकार है। मुझे संदेह है कि आप इसे SearchResults ऑब्जेक्ट वापस करने का इरादा रखते हैं। और यह Query& पैरामीटर लेता है, इसलिए पैक किए गए कार्य के लिए उपयुक्त हस्ताक्षर SearchResults(Query&) होगा।

1) लैम्ब्डा राज्य नहीं है कि यह वापसी प्रकार सही ढंग से है:

[=](Query& q) -> SearchResults { 
     index::core::Merger merger; 
     return merger.search(q); 
} 
+0

आपके उत्तर के लिए धन्यवाद, मैंने इसे अब बदलने की कोशिश की है: 'std :: packaged_task कार्य ([खोज परिणाम] (क्वेरी और क्यू) { अनुक्रमणिका :: कोर :: विलय विलय; वापसी merger.search (q); }); ' –

+0

@emteh ओह, इसके बारे में खेद है। यह उचित वाक्यविन्यास नहीं है। मैंने इसे संपादित किया। मैं कुछ और करने के लिए बाहर गया और जवाब में उचित वाक्यविन्यास लिखना भूल गया ... –

+0

धन्यवाद, यह तय हो गया। उस से संबंधित त्रुटियां गायब हो गईं। मेरे पास अभी भी संरेखण त्रुटि संदेश है। '[=]' बनाम '[] 'कोई फर्क नहीं पड़ता। –

0

अद्यतन कोड दो समस्याएं हैं। वाक्य रचना आप चाहते है (यह मानते हुए कि आप किसी भी स्थानीय चर नकल की जरूरत नहीं है) है:

[](Query& q) -> SearchResults { 
     index::core::Merger merger; 
     return merger.search(q); 
} 

2) यह देखते हुए कि पैक काम के लिए एक Query& की आवश्यकता है, तो आप एक गैर के लिए एक संदर्भ पारित करने के लिए की आवश्यकता होगी std::thread कन्स्ट्रक्टर के दूसरे तर्क के रूप में निरंतर क्वेरी, ताकि इसे कार्य में पारित किया जा सके।

मैं क्या याद नहीं आ रहा है, तो आप कानूनी तौर पर एक गैर-निरंतर क्वेरी संदर्भ ठीक से दूसरा तर्क के रूप में std::thread को पारित कर सकते हैं, या आप इतना है कि यह ठीक से संदर्भ द्वारा दूसरा तर्क गुजरता std::ref(q) का उपयोग करने की आवश्यकता होगी, तो है। नोट: उम्मीदवार 1 तर्क, 0 प्रदान की उम्मीद

लिखा रूप में, यह के रूप में द्वारा

/usr/include/c++/4.6/future:1272:7 संकेत दिया है, कोई तर्क के साथ कार्य कॉल करने के लिए प्रयास कर रहा है

+0

'std :: thread' डिफ़ॉल्ट रूप से तर्कों की प्रतिलिपि बनायेगा, इसलिए आपको' std :: ref' –

+0

@davs की आवश्यकता है: धन्यवाद अब इसे ठीक किया गया है, जिससे कुछ समस्याएं हल हुईं। मूल त्रुटि अभी भी, के माध्यम से है। –

+0

@ जोनाथनवाली: धन्यवाद, 'std :: ref (query) 'के माध्यम से कोई फर्क नहीं पड़ता। अभी भी 'std :: bind' संबंधित त्रुटि है। –

संबंधित मुद्दे