2013-07-26 16 views
6

क्या जंग में एकाधिक धागे के बीच एक परिवर्तनीय चर साझा करना संभव है?जंग में थ्रेड के बीच परिवर्तनीय चर साझा करना

fn main() { 

    let mut msg = "Hi"; 
    // ... 
    msg = "Hello, World!"; 

    do spawn { 
     println(msg); 
    } 

    do spawn { 
     println(msg); 
    } 

} 

मैं इस त्रुटि मिलती है: निम्नलिखित को देखते हुए

error

चर सिर्फ पैदा धागे की केवल पढ़ने की जरूरत है। परिवर्तनीय को हालांकि परिवर्तनीय होना चाहिए, क्योंकि जो मैं वास्तव में करने की कोशिश कर रहा हूं वह कई धागे के बीच हैश मैप साझा करता है। जहां तक ​​मुझे पता है कि हैश मैप को पॉप्युलेट करने का कोई तरीका नहीं है जब तक कि यह उत्परिवर्तनीय न हो। भले ही ऐसा करने का कोई तरीका है, फिर भी, मुझे यह जानने में दिलचस्पी है कि सामान्य रूप से ऐसा कुछ कैसे पूरा किया जाए।

धन्यवाद!

उत्तर

8

इस प्रतिबंध को भाषा के भविष्य के संस्करण में हटाया जाना है। उस ने कहा, आप let msg = msg; के साथ पहले do spawn से पहले इस समस्या को ठीक कर सकते हैं। वैल्यू msg को एक अपरिवर्तनीय स्थान पर ले जाएगा, प्रभावी ढंग से इसकी परिवर्तनशीलता को बदल देगा।

+0

यह चाल है! धन्यवाद! –

+1

जब आप कहते हैं कि "यह प्रतिबंध हटाया जाना है", वास्तव में क्या बदल रहा है? कॉपी-ऑन-कैप्चर डिफ़ॉल्ट हो जाएगा? या, आप एक म्यूटेबल चर को कैप्चर करने में सक्षम होंगे जब तक कि आपके लैम्ब्डा को अंतिम असाइनमेंट के बाद बनाया गया हो? –

3

स्ट्रिंग "हैलो, वर्ल्ड!" स्ट्रिंग साझा करने के मामले में, आपको केवल वैरिएबल को एक अपरिवर्तनीय स्थान में स्थानांतरित करने की आवश्यकता होगी (उदाहरण के लिए, "म्यूट msg = .....; msg msgstr" msg = ; ")।

शायद आप इसे प्राप्त करने वाले प्रत्येक थ्रेड के लिए हैशपैप की एक अलग प्रतिलिपि बनाने से बचना चाहते हैं, हालांकि, इस मामले में आप इसे ARC (परमाणु संदर्भित रैपर) के अंदर भी रखना चाहते हैं, जिसे आप ' extra::arc में मिलेगा।

+0

तो जब 'let msg = msg; 'कर रहे हैं,' जंग प्रत्येक स्प्रेड किए गए थ्रेड के लिए 'msg' की अपरिवर्तनीय प्रति बना रहा है? –

+0

@EvanByrne उस मामले में जंग एक नए, अपरिवर्तनीय संदर्भ के साथ पिछले उत्परिवर्तनीय संदर्भ छायांकन कर रहा है। यह अपरिवर्तनीय संदर्भ तब धागे को पारित किया जा सकता है। कम से कम इस व्यवहार को मैं समझता हूं। –

3

"सामान्य में" उत्तर (हैश तालिका को साझा करने के दौरान परिवर्तनीय रखने के बारे में) यह है कि यह सीधे संभव नहीं है; जंग को विशेष रूप से कुछ प्रकार की बग से बचने और कुछ प्रकार की सुरक्षा (और अन्य कारणों से) की रक्षा करने के लिए उत्परिवर्तनीय राज्य के साझाकरण को रोकने के लिए डिज़ाइन किया गया था।

हालांकि, साझा म्यूटेबल हैश तालिका की तरह कुछ बनाना संभव है। कल्पना कीजिए कि एक ही कार्य में एक परिवर्तनीय हैश तालिका है। आप कोड लिख सकते हैं ताकि अन्य कार्य इसे संदेश भेज सकें, अनिवार्य रूप से "हैश तालिका अपडेट करें ताकि 5 मानचित्र 18 हो जाएं" या "मुझे 7 मानचित्र बताएं"।

यह संकेत क्या पूरा करता है? सबसे पहले, संदेशों में मूल्यों की प्रतिलिपि बनाकर, किसी अन्य कार्य को पढ़ने के बीच में (सभी बड़ी सुरक्षा समस्या), और दूसरा, अप्रत्यक्ष रूप से कोड लिखकर, सभी स्मृति को टंप करने के लिए संभव नहीं है, यह प्रोग्रामर के लिए अधिक स्पष्ट है परमाणु संचालन क्या है और क्या नहीं है; प्रोग्रामर यह उम्मीद नहीं करेगा कि हैश टेबल सामग्री के बारे में लगातार दो संदेश हैश टेबल के समान संस्करण के बारे में जरूरी नहीं हैं, एक धारणा जो पूरी तरह मान्य है (कम से कम जंग में, कुछ अन्य प्रतिबंधों के लिए धन्यवाद) लगभग दो पढ़े जाते हैं एक unshared, mutable, हैश टेबल से।

+0

यह निश्चित रूप से एक आशाजनक दृष्टिकोण की तरह लगता है। क्या मानक पुस्तकालय में कुछ विशिष्ट है जो मुझे ऐसी चीज को पूरा करने में मदद करेगा? –

+0

मुझे नहीं पता कि, क्षमा करें!मानक पुस्तकालय अभी भी बढ़ रहा है; आप इसे स्वयं जोड़ने पर विचार करना चाहेंगे। –

+0

यदि मुझे ऐसा करने का कोई तरीका पता है तो मैं इसे गीथूब पर उपलब्ध कराने के लिए सुनिश्चित करूंगा :) –

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