projects
/
rust-101.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
mutable references wording
[rust-101.git]
/
solutions
/
src
/
counter.rs
diff --git
a/solutions/src/counter.rs
b/solutions/src/counter.rs
index 265fb99d972fcfd6388c6445a207082e42c00320..319058e51796f2e7fd34bf9686687276137a5861 100644
(file)
--- a/
solutions/src/counter.rs
+++ b/
solutions/src/counter.rs
@@
-2,7
+2,7
@@
use std::sync::{Arc, RwLock};
use std::thread;
#[derive(Clone)]
use std::thread;
#[derive(Clone)]
-struct ConcurrentCounter(Arc<RwLock<usize>>);
+
pub
struct ConcurrentCounter(Arc<RwLock<usize>>);
impl ConcurrentCounter {
// The constructor should not be surprising.
impl ConcurrentCounter {
// The constructor should not be surprising.
@@
-11,12
+11,19
@@
impl ConcurrentCounter {
}
pub fn increment(&self, by: usize) {
}
pub fn increment(&self, by: usize) {
- let mut counter = self.0.write().unwrap
(
);
+ let mut counter = self.0.write().unwrap
_or_else(|e| e.into_inner()
);
*counter = *counter + by;
}
*counter = *counter + by;
}
+ pub fn compare_and_inc(&self, test: usize, by: usize) {
+ let mut counter = self.0.write().unwrap_or_else(|e| e.into_inner());
+ if *counter == test {
+ *counter += by;
+ }
+ }
+
pub fn get(&self) -> usize {
pub fn get(&self) -> usize {
- let counter = self.0.read().unwrap
(
);
+ let counter = self.0.read().unwrap
_or_else(|e| e.into_inner()
);
*counter
}
}
*counter
}
}