2012-05-07 10 views
7

पर एकाधिक तर्क पास करना मेरे पास वर्कफ़ोर थ्रेड नामक एक फ़ंक्शन है, जिसमें दो तर्क होते हैं, और शून्य लौटाते हैं। मैं की तरह कुछ का उपयोग कर इस समारोह थ्रेड चाहते हैं:थ्रेडेड फ़ंक्शन

thread(workForThread,a,b); 

कहाँ a और b उचित प्रकार के होते हैं। उपर्युक्त कोड संकलित नहीं करता है, "कॉल के लिए बहुत से तर्क" त्रुटि ("त्रुटि C2197: 'शून्य (__cdecl *) (char *)': कॉल के लिए बहुत से तर्क")

मैं इसे कैसे हल कर सकता हूं ?

नोट: मैं thesetwo सवालों पर ध्यान दिया है, लेकिन प्रस्तावों कि काम क्या मेरे लिए काम करने के लिए नहीं है। इसके अतिरिक्त, मुझे लगता है कि इसे C++ 11 में बनाने का एक तरीका है, और यही वह है जिसे मैं ढूंढ रहा हूं।

+1

सी ++ 11 थ्रेड में एक (टेम्पलेट) कन्स्ट्रक्टर है जो वास्तव में करता है। – Mat

+0

तो फिर मुझे यह त्रुटि क्यों दे रही है? – soandos

+0

आपके पास वीएस का कौन सा संस्करण है? शायद यह इसका समर्थन नहीं करता है। – Mat

उत्तर

7

सी ++ 11 का उपयोग करते समय आप एक लैम्ब्डा फ़ंक्शन का उपयोग कर सकते हैं जो संदर्भ के (गैर-औपचारिक) पैरामीटर का उपयोग कर सकता है। "कैप्चरिंग"

कुछ

तरह
void doIt (int a, int b) { // do something, your workForThread 
} 

.. 
int a = 1; 
int b = 2; 

std:thread r ([=](){doIt (a, b); return 1;}); 

जब केवल एक ही समारोह juanchopanza जवाब बुला कुछ और अधिक कुशल हो सकता है के बाद से कोई नया कार्य बनाया जाएगा।

लैम्ब्डा संस्करण आपको अधिक कॉन्फ़िगर करने की अनुमति देता है। मान लीजिए कि आप थ्रेड शुरू कर रहे हैं जो अंत में 2 कार्यों में से 2 कार्यों में कॉल करता है। Juanchopanza दृष्टिकोण को प्रत्येक क्रमपरिवर्तन के लिए NAMED फ़ंक्शंस की आवश्यकता होगी।

इस समय मैं दोनों दृष्टिकोणों का अंतर ज्यादातर स्वाद का विषय मानता हूं।

जब आप लैम्ब्डा कार्यों के बारे में

What is a lambda expression in C++11?

+0

क्या आप कृपया मुझे दिखा सकते हैं कि आपका क्या मतलब है? मुझे सी ++ लैम्बडास – soandos

+0

के साथ अनुभव नहीं है यह मेरा कार्य कहां है? – soandos

+0

यह अब संकलित करता है, लेकिन "__declspec (noinline) शून्य __cdecl _CRT_DEBUGGER_HOOK (int _Reserved)" में कोई घातक त्रुटि का कारण है, इसका कोई कारण क्या है? – soandos

13

सी ++ 11 में, जिस तरह से यह करने के लिए अधिक या कम जिस तरह से आप का प्रयास किया है है अधिक पढ़ने के लिए चाहते:

std::thread myThread(workForThread,a,b); 

प्रदान किया गया कार्यफॉर थ्रेड एक (गैर-सदस्य) फ़ंक्शन है जो उन दो पैरामीटर लेता है।

+0

शायद यह भी जोड़ें कि फ़ंक्शन ओवरलोड नहीं किया जा सकता है। मुझे लगता है कि उसके मामले में समस्या है। – inf

+0

@ बांसबोर्न का मतलब क्या नहीं है? – juanchopanza

+0

मान लें कि आपके पास वर्कफ़र्थ्रेड (int, int) और वर्कफ़र्थ्रेड (int) है, तो यह संकलित नहीं होगा। – inf