मुझे पता है कि जंग का 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);
}
}
उदाहरण के लिए, मैं इस कार्यक्रम में लिख सकते हैं
क्रिस मॉर्गन के अलावा उत्तर: आप तथाकथित आंतरिक परिवर्तनशीलता [आधिकारिक 'std' दस्तावेज़ीकरण] (https://doc.rust-lang.org/std/cell/index.html) के बारे में पढ़ सकते हैं। 'रेफसेल' एक और उदाहरण है। –