कांटा () बनाम std :: Async में C ++
मैं asyc और कांटे की अवधारणाओं के लिए नया हूं, जो मैंने अब तक समझा है वह यह है कि कांटा () चिड प्रक्रियाओं का निर्माण करता है जो अतुल्यकालिक रूप से चलेगा। और std :: async सिस्टम पूल से एक थ्रेड बनायेगा और इसे एसिंक्रोनस रूप से यहाँ लॉन्च करेगा यदि मैं std :: launch :: aync का उल्लेख करता हूँ ।
उदाहरण के लिए नीचे दिए गए कोड के सेट में अंतर कैसे होता है? 1: std :: async का उपयोग करना
std::vector<std::future<void>> result;
for(i=0;i<5;i++){
result. push_back(std::async(std::launch::asyc, foo, var1));
}
for( auto e : result)
e.get();
दूसरा: कांटा का उपयोग करना ()
for(i=0;i<5;i++){
if(fork()==0){
foo(var1);
exit(0);
}
}
मान लें कि foo फ़ंक्शन रिटर्न प्रकार शून्य है, और तर्क को संदर्भ या संकेत के रूप में पारित किया जाता है।
जवाब
महत्वपूर्ण अंतर यह है कि मामले में std::async, निष्पादन के दो धागे एक प्रक्रिया को साझा करते हैं। के मामले में fork, वे प्रत्येक की अपनी प्रक्रिया है।
यह अंतर कॉल के बाद बदलने वाली चीजों को सबसे अधिक प्रभावित करता है। के मामले में fork, प्रत्येक प्रक्रिया तब अपने स्वयं के फ़ाइल डिस्क्रिप्टर को खोल और बंद कर सकती है, अपनी मेमोरी स्पेस को प्रबंधित कर सकती है, और इसी तरह। के मामले में std::async, थ्रेड्स फ़ाइल डिस्क्रिप्टर, मेमोरी स्पेस और इतने पर साझा करना जारी रखते हैं।
fork()
fork()कॉलिंग प्रक्रिया को डुप्लिकेट करके एक बच्चा प्रक्रिया बनाता है । बच्चे की प्रक्रिया माता-पिता की प्रक्रिया से अलग हो जाती है, इसलिए प्रत्येक की अपनी स्मृति होती है और किसी भी अंतर-प्रक्रिया संचार चैनल को स्थापित किए बिना दो प्रक्रियाओं के बीच डेटा पारित करना असंभव है। कॉल fork()करने के लिए सबसे आम उपयोग मामला एक पृष्ठभूमि सेवा (उर्फ "डेमॉन") के रूप में एक प्रक्रिया शुरू करना है। उदाहरण के लिए जब आप कमांड लाइन पर अपना पसंदीदा वेब सर्वर शुरू करते हैं, तो यह एक बच्चे की प्रक्रिया (वास्तविक सर्वर प्रक्रिया) को बंद कर सकता है। एक बार जब मुख्य प्रक्रिया समाप्त हो जाती है तो नियंत्रण आपके शेल में वापस आ जाता है और आप अन्य चीजें कर सकते हैं।
std::async
std::asyncएक अलग थ्रेड ( कार्य नीति std::launch::async) में एक कार्य निष्पादित करता है । यह उस std::futureपर रिटर्न देता है जिस पर आप get()फ़ंक्शन द्वारा लौटाए गए मान को प्राप्त करने के लिए कॉल कर सकते हैं (यह मानते हुए कि यह वापस आ गया है और अपवाद नहीं फेंकता है)। get()कॉल तुरंत वापस लौट जब तक समारोह वापस आ गया है समारोह, इस बीच में पूर्ण कर लिया है अन्यथा यह ब्लॉक। यह सुविधा std::asyncकुछ और करते समय पृष्ठभूमि में महंगी गणना चलाने के लिए एक उपयोगी उपकरण बनाती है।