ऊपर दिए गए सभी संकेत अनुक्रमिक कार्यक्रमों के लिए सही हैं, मेरा मतलब है, धागे के बिना कार्यक्रम। धागे का उपयोग चीजों को बदलना। सबसे पहले, std :: थ्रेड के डिफ़ॉल्ट पैरामीटर द्वारा फ़ंक्शन और फ़ंक्शंस पैरामीटर हैं। शायद आप पुस्तक "कार्रवाई में सी ++ संगामिति" अध्ययन कर रहे थे, और लेखक एक दिलचस्प उदाहरण दिखाता है:
void do_some_work();
thread my_thread(do_some_work); //thread receives the function address
इस समारोह मान लीजिए:
शून्य do_other_job (पूर्णांक कश्मीर); कोड के शरीर में, आप क्या करना चाहिए:
k=3;
thread my_thread2(do_other_job, k);
आदेश एक और धागा अंडे में।
तो, थ्रेड का उपयोग करके कंपाइलर f (std :: thread my_thread (f);) डिफ़ॉल्ट रूप से कक्षा के बजाय फ़ंक्शन के रूप में व्याख्या करता है। इसे बदलने के लिए आपको एक क्लास के साथ काम कर रहे संकलक को चेतावनी देने के लिए ऑपरेटर() शुरू करना होगा। एक वैकल्पिक कोड हो सकता है:
class background_task{
public:
background_task(){
do_sth();
do_sth_else();
}
void operator()(){}
};
background_task f;
thread mythread10(f);
आखिरकार, यह सही नहीं है, धागे का उपयोग कर, ऑपरेटर खिला है, इसलिए इस कोड काम नहीं करता:
void operator()(int x){
do_sth();
cout<<"x = "<<x<<endl;
}
यह अंदर सभी कोड वजह से होता ब्रैकेट केवल पढ़ने के लिए होते हैं, और रन-टाइम के दौरान बदला नहीं जा सकता है। यदि आप कन्स्ट्रक्टर में एक चर डालने का लक्ष्य रखते हैं, तो इसे थ्रेड प्रारंभ में रखा जाना चाहिए। तो:
class backg{
public:
backg(int i){
do_sth(i);
}
void operator()(){}
};
int main(){
thread mythread{ backg(12) }; //using c++11
return 0;
}
गलतियों के बिना चलाएगा, और थ्रेड में फंक्शन do_sth (12) निष्पादित करेगा।
मुझे उम्मीद है कि मैंने मदद की है।
ठंडा, अब और अधिक स्पष्ट है। –
क्या इस स्पष्ट कॉल कार्य() को छोड़कर ऑपरेटर()() के लिए कोई निहित कॉल है? –
@ forester2012, आपको हमेशा इसे स्पष्ट रूप से कॉल नहीं करना चाहिए, हालांकि आप अधिक अजीब 'task.operator()() 'वाक्यविन्यास का भी उपयोग कर सकते हैं। कई मानक एल्गोरिदम हैं जो इस ऑपरेटर को आंतरिक रूप से कॉल करेंगे। –