मेरे पास एक विशाल वेक्टर है जो मैं समानांतर में लोड/कार्य करने में सक्षम होना चाहता हूं, उदा। एक धागे में पहले सौ हजार सूचकांक लोड करें, अगले में एक और आगे। इस कोड का एक बहुत गर्म हिस्सा होने जा रहा है के रूप में, मैं अवधारणा असुरक्षित कोड के इस निम्नलिखित सबूत के साथ आए हैं वृत्तखण्ड और Mutexes बिना यह करने के लिए:समानांतर में प्रोसेसिंग वीसी: सुरक्षित तरीके से कैसे करें, या अस्थिर सुविधाओं का उपयोग किए बिना?
let mut data:Vec<u32> = vec![1u32, 2, 3];
let head = data.as_mut_ptr();
let mut guards = (0..3).map(|i|
unsafe {
let mut target = std::ptr::Unique::new(head.offset(i));
let guard = spawn(move || {
std::ptr::write(target.get_mut(), 10 + i as u32);
});
guard
});
क्या मैं यहाँ याद है कि कर सकते हैं इसे संभावित रूप से उड़ाओ?
यह #![feature(unique)]
का उपयोग करता है, इसलिए मुझे यह नहीं पता कि स्थिर में इसका उपयोग कैसे किया जाए। क्या इस तरह की चीज स्थिर में करने का कोई तरीका है (कच्चे पॉइंटर्स और Arc
और Mutex
के ओवरहेड का उपयोग किए बिना आदर्श रूप से सुरक्षित रूप से?
इसके अलावा, documentation for Unique
को देखते हुए, यह
कहते हैं यह भी संकेत मिलता है कि सूचक की दिग्दर्शन
Unique
संदर्भ के लिए एक अनूठा पथ के बिना संशोधित किया जा नहीं करना चाहिए
मैं स्पष्ट नहीं कर रहा हूँ क्या "अद्वितीय पथ" का अर्थ है।
'Vec.split_at_mut (..) 'आपके लिए काम कर सकता है? – llogiq
आप इसे पारस्परिक रूप से विभाजित कर सकते हैं लेकिन आप अभी भी कार्यकर्ता धागे में स्वामित्व को स्थानांतरित करने के तरीके से अटक गए हैं और फिर इसे वापस प्राप्त कर सकते हैं। मैं यह नहीं देखता कि कार्यकर्ता धागे कंप्यूटिंग करते समय सुरक्षित रूप से ऐसा कैसे करें, पैरेंट थ्रेड में आपके पास अभी भी मूल vec पर उत्परिवर्तनीय पहुंच है। जीवनकाल के मुद्दे भी हैं क्योंकि क्लोजर ब्लॉक से बच सकता है, अनबॉक्स किए गए बंद होने से यह ठीक हो सकता है - हालांकि मुझे उनके बारे में बहुत कुछ पता नहीं है। – sgldiv
एक बार ['scoped'] (https://doc.rust-lang.org/nightly/std/thread/fn.scoped.html) उचित प्रतिस्थापन प्राप्त करता है 'split_at_mut' सही समाधान है। तब तक मैं सुझाव देता हूं कि प्रत्येक धागे के लिए एक से अधिक वैक्टर बनाएं। इस प्रयोजन के लिए –