Add ARC::get method and implements the function from it. Add an example showing a simple use of ARC.
This commit is contained in:
parent
a9c7d3f775
commit
3f232bc4a0
@ -8,9 +8,33 @@
|
|||||||
// option. This file may not be copied, modified, or distributed
|
// option. This file may not be copied, modified, or distributed
|
||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
/**
|
/*!
|
||||||
* Concurrency-enabled mechanisms for sharing mutable and/or immutable state
|
* Concurrency-enabled mechanisms for sharing mutable and/or immutable state
|
||||||
* between tasks.
|
* between tasks.
|
||||||
|
*
|
||||||
|
* # Example
|
||||||
|
*
|
||||||
|
* In this example, a large vector of floats is shared between several tasks.
|
||||||
|
* With simple pipes, without ARC, a copy would have to be made for each task.
|
||||||
|
*
|
||||||
|
* ~~~
|
||||||
|
* extern mod std;
|
||||||
|
* use std::arc;
|
||||||
|
* let numbers=vec::from_fn(100, |ind| (ind as float)*rand::random());
|
||||||
|
* let shared_numbers=arc::ARC(numbers);
|
||||||
|
*
|
||||||
|
* for 10.times {
|
||||||
|
* let (port, chan) = stream();
|
||||||
|
* chan.send(shared_numbers.clone());
|
||||||
|
*
|
||||||
|
* do spawn {
|
||||||
|
* let shared_numbers=port.recv();
|
||||||
|
* let local_numbers=shared_numbers.get();
|
||||||
|
*
|
||||||
|
* // Work with the local numbers
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* ~~~
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use sync;
|
use sync;
|
||||||
@ -93,9 +117,14 @@ pub fn ARC<T:Const + Owned>(data: T) -> ARC<T> {
|
|||||||
* wrapper.
|
* wrapper.
|
||||||
*/
|
*/
|
||||||
pub fn get<'a, T:Const + Owned>(rc: &'a ARC<T>) -> &'a T {
|
pub fn get<'a, T:Const + Owned>(rc: &'a ARC<T>) -> &'a T {
|
||||||
unsafe { &*rc.x.get_immut() }
|
rc.get()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<T:Const+Owned> ARC<T> {
|
||||||
|
pub fn get<'a>(&'a self) -> &'a T {
|
||||||
|
unsafe { &*self.x.get_immut() }
|
||||||
|
}
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Duplicate an atomically reference counted wrapper.
|
* Duplicate an atomically reference counted wrapper.
|
||||||
*
|
*
|
||||||
@ -508,6 +537,7 @@ mod tests {
|
|||||||
c.send(arc::clone(&arc_v));
|
c.send(arc::clone(&arc_v));
|
||||||
|
|
||||||
assert_eq!((*arc::get(&arc_v))[2], 3);
|
assert_eq!((*arc::get(&arc_v))[2], 3);
|
||||||
|
assert_eq!(arc_v.get()[4], 5);
|
||||||
|
|
||||||
info!(arc_v);
|
info!(arc_v);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user