2016-02-08 4 views
8

मैं कंप्यूटिंग रहा से अधिक थ्रेड से float और इस प्रकार एक ही vector<float> की गैर-अतिव्यापी श्रेणियों में परिणाम भंडारण:एक ही वेक्टर सुरक्षित की विभिन्न श्रेणियों के लिए std :: प्रतिलिपि एकाधिक धागे से कॉपी कर रहा है?

धागे मैं से किसी को चलाने से पहले vector::reserve का उपयोग कर पूर्व आवंटित यह।

प्रत्येक थ्रेड में एक धागा विशिष्ट परिणामों की vector गणना की और फिर इस तरह लक्ष्य कंटेनर में बनाई जाए:

vector<float>::iterator destination = globalVector.begin() + threadSpecificIndex; 
std::copy(localVector.begin(), localVector.end(), destination); 

यह एक सुरक्षित अभ्यास है?

+8

'std :: वेक्टर :: रिजर्व' नहीं करेगा, आपको वास्तव में 'आकार बदलना होगा) - अन्यथा आप वेक्टर के वास्तविक' अंत()' से आगे लिखेंगे। – mindriot

+0

@ मिंड्रियट टिप्पणी में जोड़ने के लिए: यदि आपके द्वारा संग्रहीत किए जाने वाले प्रकार में डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है तो आप सीधे अपने प्रकार के बजाय 'boost :: वैकल्पिक' जैसे कुछ का उपयोग कर सकते हैं। इससे लाभ जोड़ा होगा जो आप बता सकते हैं कि कुछ 'वास्तविक अभी तक वास्तविक' वस्तुओं को बनाने के बिना कुछ विफल हुआ है जो स्वयं को पूरी तरह से तैयार नहीं करते हैं। वे घृणित हैं। –

उत्तर

7

पहले vector::reserve वास्तव में कोई तत्व नहीं बनाते हैं। यह सिर्फ वेक्टर की क्षमता निर्धारित करता है। यदि आपको वहां होने वाले तत्वों की आवश्यकता है तो आपको vector::resize की आवश्यकता है या बस आवश्यक आकार के लिए वेक्टर बनाएं।

दूसरा अंगूठे का नियम यह है कि यदि आपके पास धागे के बीच साझा वस्तु है और उनमें से कम से कम एक लेखक है तो आपको सिंक्रनाइज़ेशन की आवश्यकता है। चूंकि इस मामले में "ऑब्जेक्ट" इटेटरेटर रेंज है और वे ओवरलैप नहीं करते हैं तो आप इस संबंध में ठीक हैं। जब तक वैक्टर का आकार नहीं बदला जाता है तब तक आपको ठीक होना चाहिए।

एक समस्या जो आप के साथ हो सकती है वह झूठी साझाकरण है। यदि एक ही कैश लाइन में वेरिएबल होते हैं जो विभिन्न थ्रेड का उपयोग कर रहे हैं तो उन कैश लाइनों को प्रत्येक बार एक चर में अद्यतन होने पर फिर से सिंक्रनाइज़ करना होगा। यह कोड के प्रदर्शन को थोड़ा धीमा कर सकता है।

+0

कैश के बारे में अच्छा बिंदु। मुझे आश्चर्य है कि क्या कोई अन्य कंटेनर बेहतर फिट होगा, लेकिन अनुमान लगाएं कि इस कैश चीज के साथ भी, वेक्टर सबसे तेज़ है। –

+0

@piotrsmaron वेक्टर आमतौर पर बेहतर विकल्प है। जब तक इटरेटर की सीमा कैश लाइन से बड़ी होती है तब तक झूठी साझाकरण कोई समस्या नहीं होनी चाहिए। मैंने अभी इसे एक संभावित गड़बड़ी के रूप में वर्णित किया है और मैंने इसे छोटी श्रेणियों पर देखा है। – NathanOliver

+0

@jaggedSpire कोई समस्या नहीं है। व्याकरण समीक्षा के लिए धन्यवाद। – NathanOliver

2

वेक्टर आकार तय किया है (और ऐसा लगता है कि यह की तरह अपने प्रश्न से है), और पर्वतमाला अतिव्यापी, तो नहीं कर रहे हैं:

  1. वेक्टर
  2. अलग धागे पुनः आवंटन नहीं किया जाएगा नहीं होगा उसी स्मृति तक पहुंच

इस प्रकार मुझे यहां कोई डेटा दौड़ दिखाई नहीं दे रही है। (लेकिन आपके प्रश्न पर पहली टिप्पणी के अनुसार, आपको यह सुनिश्चित करना होगा कि जब इसका उपयोग किया जाता है तो वेक्टर के पास यह निश्चित आकार होता है)। आप std :: प्रतिलिपि के लिए "डेटा रेस" अनुभाग भी देख सकते हैं: http://www.cplusplus.com/reference/algorithm/copy/

+0

जब तक यह 'वेक्टर ' –

+0

नहीं है, यह सही है। वेक्टर द्वारा मेरा मतलब वेक्टर था, जो प्रश्न का लेखक पूछ रहा था, लेकिन इसे सीधे करने के लिए धन्यवाद। –

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