Advertisement
Guest User

Untitled

a guest
Sep 18th, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.88 KB | None | 0 0
  1. use std::sync::atomic::{AtomicPtr,Ordering};
  2. use std::sync::{Arc};
  3.  
  4. struct Thing<T> {
  5. data: Arc<AtomicPtr<Option<T>>>,
  6. }
  7.  
  8. impl<T> Thing<T> {
  9. fn new () -> Thing<T> {
  10. Thing {data: Arc::new(AtomicPtr::new(&mut None))}
  11. }
  12. fn clone (&self) -> Thing<T> {
  13. Thing {data: self.data.clone()}
  14. }
  15. }
  16.  
  17. fn main () {
  18. let ap: Thing<int> = Thing::new();
  19. let ap2 = ap.clone();
  20. //let ap3 = ap.clone(); //uncommenting produces: ap2: Some(16777217)
  21. ap.data.store(&mut Some(1),Ordering::Relaxed);
  22.  
  23. spawn(proc() {
  24. let r = unsafe{*ap2.data.load(Ordering::Relaxed)};
  25. println!("ap2: {}",r); // produces "ap2: None" unless we uncomment others
  26. });
  27.  
  28.  
  29. // finally, with uncommenting all below each threads expectantly print out:
  30. //ap3: Some(1)
  31. //ap2: Some(1)
  32.  
  33. // let r = unsafe{*ap3.data.load(Ordering::Relaxed)};
  34. // println!("ap3: {}",r);
  35. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement