2012-04-07 24 views
8

क्या किसी को भी नए std::async के साथ अनुभव है? वर्तमान में हम एक समांतर फ़ाइल पार्सर को कार्यान्वित कर रहे हैं, जो फ़ाइल खंड को पढ़ता है और इस खंड को एसिंक फ़ंक्शन में पास करता है।std :: async (std :: launch :: async) बनाम जीसीसी का व्यवहार बनाम क्लैंग का व्यवहार

क्लैंग (v3.0) का उपयोग करके इस तरह से डिफ़ॉल्ट std::async नीतियों (कार्यान्वयन निर्भर) के साथ वास्तव में ठीक काम करता है। दो कोर मशीन पर, यह 4 धागे तक आग लगती है जो वास्तव में अच्छी तरह से काम करती है।

लेकिन जीसीसी (v4.7) के साथ, फ़ाइल रीडिंग थ्रेड किसी नए थ्रेड को नहीं बढ़ाता है, जिससे कार्यक्रम पूरी तरह अनुक्रमिक हो जाता है।

std::launch::async का उपयोग करके, दोनों संस्करण काफी समान हैं (मामले क्या होना चाहिए)।

क्या किसी को भी जीसीसी की सी ++ 11 थ्रेडिंग क्षमताओं के वर्तमान स्थिति की स्थिति पता है? या यह हमारे कार्यान्वयन में एक त्रुटि हो सकती है?

लघु कोड:

while (readNewChunk()) { 
    Chunk &chunk = fileReader_.getChunk(); //reading the file 
    ChunkLoader *chunkLoader = new ChunkLoader(); 
    auto ftr = std::async(std::launch::async, &ChunkLoader::createDictionaries, chunkLoader); 
    dictCreationFutures_.push_back(std::move(ftr)); 
} 
+0

मैं वास्तव में बूस्ट का उपयोग करने की सलाह दूंगा। यह उचित सी ++ 11 समर्थन के लिए एक बड़ी छलांग नहीं होगी। सी ++ 11 में नए थ्रेडिंग मॉडल को जीसीसी या एमएसवीसी का उपयोग कर एक अलग मेमोरी लेआउट की आवश्यकता होती है, और वे वास्तव में बहुत कुछ लागू नहीं किए जाते हैं। –

उत्तर

15

व्यवहार कल्पना के भीतर है, भले ही यह आपकी इच्छा न हो। यदि आप लॉन्च पॉलिसी निर्दिष्ट नहीं करते हैं, तो इसे async|deferred माना जाता है, जिसका अर्थ है कि यह तय करने के लिए कार्यान्वयन पर निर्भर है। यदि कोई विकल्प दिया गया तो जीसीसी हमेशा deferred चुनना होता है।

+0

इसे साफ़ करने के लिए धन्यवाद। मैंने सोचा कि सभी मौजूदा कार्यान्वयन थोड़ा अधिक "बुद्धिमान" हैं और सिर्फ एक सादा _deferred_ नहीं कर रहे हैं। – Bouncner

+4

मैं असहमत होना चाहता हूं। मानक यही कहता है (जोर मेरा): "यदि यह नीति अन्य नीतियों के साथ एक साथ निर्दिष्ट की गई है, जैसे कि 'लॉन्च :: एसिंक | लॉन्च :: स्थगित' के पॉलिसी मूल्य का उपयोग करते समय, कार्यान्वयन को आमंत्रण या चयन को रोकना चाहिए पॉलिसी _ जब कोई और सहमति प्रभावी ढंग से शोषित नहीं की जा सकती है। " यह किसी भी नए धागे को स्थगित करने से काफी अलग है। –

5

EDIT2: मैं थोड़ा अधिक बताएंगे।

std :: async एक 'भविष्य' का वादा करता है; वह है: जब आप इसे चाहते हैं, तो यह वहां होगा। इसकी गणना अब की जा सकती है, जब आप इसके लिए पूछते हैं तो इसकी गणना की जा सकती है, हम केवल यह वादा कर रहे हैं कि ऐसा होगा।

मेरे नीचे पोस्टर की तरह नोट्स, जीसीसी स्थगित करने के लिए डिफ़ॉल्ट (जिसका अर्थ है, यह उस वादे को पूरा करेगा जब इसे इसके लिए कहा जाता है, और शायद पहले नहीं)। इस डिफ़ॉल्ट का कारण यह है क्योंकि जीसीसी अभी तक उचित सी ++ 11 थ्रेडिंग समर्थन प्रदान नहीं करता है। इसमें कई अन्य चीजों के बीच एक अच्छा आंतरिक थ्रेड शेड्यूलर नहीं है। यह एक हैक का एक सा है। नहीं, एक हैक का एक गुच्छा की तरह। वास्तव में, यदि आप जीसीसी पर सी ++ 11 में थ्रेडेड कोड लिखते हैं, तो यह अधिक है कि जब वे सुविधाओं को लागू करते हैं, तो यह सही काम करेगा; अभी, यह ज्यादातर सही काम करता है। मेरा मतलब है, आप अंत में परिणाम प्राप्त करते हैं, है ना?

यदि आप इसे थ्रेड लॉन्च करने के लिए कहते हैं, तो यह बहुत मूर्ख होगा (इस समय) यह महसूस करने के लिए कि यह स्वयं और कर सकता है (क्लांग के विपरीत, जिसमें वर्तमान में बेहतर आंतरिक थ्रेड शेड्यूलर है)।

संपादित करें: गंभीरता से? गलत तरीके से नीचे modding!

मेरा संदर्भ यहां है! http://gcc.gnu.org/projects/cxx0x.html। नोट 'स्मृति मॉडल' सहित 'समवर्ती' के तहत लगभग सब कुछ नोट के रूप में नोट किया गया है। GCC.GNU.org। वे जीसीसी पर अधिकार हैं जो आप जानते हैं।

थोड़ा मेरी टिप्पणी से संपादित:

मैं वास्तव में बूस्ट का उपयोग कर की सिफारिश करेंगे। जीसीसी तैयार होने पर उचित सी ++ 11 समर्थन के लिए यह एक बड़ी छलांग नहीं होगी। सी ++ 11 में नए थ्रेडिंग मॉडल को जीसीसी या एमएसवीसी का उपयोग कर एक अलग मेमोरी लेआउट की आवश्यकता होती है, और इन्हें अभी तक बहुत अधिक लागू नहीं किया गया है।

+3

"मेमोरी लेआउट" के संदर्भ में सी ++ 11 में क्या बदल गया है? –

+0

@ निकोलबोलस http://gcc.gnu.org/projects/cxx0x.html। नोट 'स्मृति मॉडल' सहित 'समरूपता' के तहत लगभग हर चीज को –

+5

हां के रूप में नोट किया गया है, लेकिन यह "स्मृति * लेआउट *" के साथ क्या बदलता है, इसकी व्याख्या नहीं करता है। लेआउट इस बात के बारे में है कि चीजें अन्य चीज़ों के सापेक्ष कहां जाती हैं। मेमोरी * मॉडल * नियमों को बताता है कि जब एक्सेस किए गए चर अन्य धागे और ऐसे में दिखाई देते हैं। –

1

तो मैं समझता हूं कि यह 2 साल बाद है, लेकिन मैं मदद नहीं कर सकता लेकिन जीसीसी बनाम क्लैंग के बारे में @ std''rrnlDave की टिप्पणी का जवाब देने की आवश्यकता महसूस कर रहा हूं, ध्यान दें कि कम से कम वर्तमान में, जनवरी 2015, दोनों क्लैंग संस्करण 3.5 और जीसीसी संस्करण 4.9 बिल्कुल वही व्यवहार है।यह व्यवहार तब होता है जब कोई लॉन्च पॉलिसी प्रदान नहीं की जाती है, अलग-अलग के लिए डिफ़ॉल्ट रूप से प्रदान की जाती है, और भविष्य में :: निष्पादित होने पर निष्पादित किया जाता है, और केवल जब एसिंक लॉन्च नीति स्पष्ट रूप से प्रदान की जाती है तो या तो संकलक पृष्ठभूमि में फ़ंक्शन निष्पादित करने के लिए नेतृत्व करेंगे।

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

  • कोई संबंधित समस्या नहीं^_^