2016-03-05 25 views
8

मुझे पता है कि जंग का Atomic* structs में ऐसे फ़ंक्शन हैं जो मान को संशोधित करते हैं, जैसे fetch_addक्यों जंग के `परमाणु *` प्रकार गैर परिवर्तनशील कार्यों का उपयोग करते मूल्य उत्परिवर्तित के लिए?

use std::sync::atomic::{AtomicUsize, Ordering}; 

struct Tester { 
    counter: AtomicUsize 
} 

impl Tester { 
    fn run(&self) { 
     let counter = self.counter.fetch_add(1, Ordering::Relaxed); 
     println!("Hi there, this has been run {} times", counter); 
    } 
} 

fn main() { 
    let t = Tester { counter: AtomicUsize::new(0) }; 
    t.run(); 
    t.run(); 
} 

यह संकलित करता है तथा ठीक चलाता है, लेकिन अगर मैं एक सामान्य पूर्णांक तक AtomicUsize बदलने के लिए, यह होगा (सही) संकलित करने के लिए अस्थिरता चिंताओं की वजह से असफल:

struct Tester { 
    counter: u64 
} 

impl Tester { 
    fn run(&self) { 
     self.counter = self.counter + 1; 
     println!("Hi there, this has been run {} times", self.counter); 
    } 
} 
उदाहरण के लिए, मैं इस कार्यक्रम में लिख सकते हैं
+2

क्रिस मॉर्गन के अलावा उत्तर: आप तथाकथित आंतरिक परिवर्तनशीलता [आधिकारिक 'std' दस्तावेज़ीकरण] (https://doc.rust-lang.org/std/cell/index.html) के बारे में पढ़ सकते हैं। 'रेफसेल' एक और उदाहरण है। –

उत्तर

11

यह बहुत उपयोगी नहीं होगा अगर यह इस तरह से काम नहीं करता है। &mut संदर्भ में, केवल एक एक समय में मौजूद कर सकते हैं, और उस समय कोई & संदर्भ है, तो ऑपरेशन के atomicity के पूरे सवाल विवादास्पद होगा।

यह देखने का एक और तरीका है &mutअद्वितीय संदर्भ, और &aliasable संदर्भ हैं है। सामान्य प्रकार के लिए, उत्परिवर्तन केवल सुरक्षित रूप से यदि आप एक विशिष्ट संदर्भ है हो सकता है, लेकिन परमाणु प्रकार उत्परिवर्तन (प्रतिस्थापन के माध्यम से) एक अद्वितीय संदर्भ की जरूरत के बिना के बारे में सभी कर रहे हैं।

& और &mut के नामकरण ज्यादा डर, अनिश्चितता के साथ एक भरा विषय रही है, और समुदाय में शक और Focusing on Ownership दस्तावेजों की तरह समझा कैसे चीजें वास्तव में कर रहे हैं। भाषा & और &mut के साथ रहने के लिए समाप्त हो गई है, लेकिन &mut वास्तव में उत्परिवर्तन की बजाय विशिष्टता के बारे में है (यह केवल इतना है कि दोनों समय बराबर हैं)।

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