Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use std::sync::atomic::{AtomicPtr,Ordering};
- use std::sync::{Arc};
- struct Thing<T> {
- data: Arc<AtomicPtr<Option<T>>>,
- }
- impl<T> Thing<T> {
- fn new () -> Thing<T> {
- Thing {data: Arc::new(AtomicPtr::new(&mut None))}
- }
- fn clone (&self) -> Thing<T> {
- Thing {data: self.data.clone()}
- }
- }
- fn main () {
- let ap: Thing<int> = Thing::new();
- let ap2 = ap.clone();
- //let ap3 = ap.clone(); //uncommenting produces: ap2: Some(16777217)
- ap.data.store(&mut Some(1),Ordering::Relaxed);
- spawn(proc() {
- let r = unsafe{*ap2.data.load(Ordering::Relaxed)};
- println!("ap2: {}",r); // produces "ap2: None" unless we uncomment others
- });
- // finally, with uncommenting all below each threads expectantly print out:
- //ap3: Some(1)
- //ap2: Some(1)
- // let r = unsafe{*ap3.data.load(Ordering::Relaxed)};
- // println!("ap3: {}",r);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement