Advertisement
Guest User

Untitled

a guest
Feb 21st, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.00 KB | None | 0 0
  1. extern crate parking_lot; // 0.7.1
  2.  
  3. use std::sync::{Arc, Mutex, RwLock};
  4. use std::cell::RefCell;
  5. use std::thread;
  6. use std::time::Duration;
  7. use parking_lot::ReentrantMutex;
  8.  
  9. struct MyCtrl {
  10. x: usize,
  11. lock: Arc<Mutex<usize>>,
  12. data: Arc<ReentrantMutex<RefCell<Vec<usize>>>>
  13. }
  14.  
  15. struct S<T: Calc> {
  16. calc: T,
  17. ctrl: MyCtrl
  18. }
  19.  
  20. impl<T: Calc> S<T> {
  21. pub fn process(&mut self, data: &[usize]) {
  22. let lock = self.ctrl.data.clone();
  23. for x in data {
  24. // trying to lock with change in thread::spawn
  25. let _lock = lock.lock();
  26.  
  27. self.ctrl.x = *x;
  28. self.calc.calc(&mut self.ctrl)
  29. }
  30.  
  31. thread::sleep(Duration::from_millis(100));
  32.  
  33. let data = self.ctrl.data.lock();
  34. let res = data.borrow();
  35. dbg!(res.len());
  36. }
  37. }
  38.  
  39. trait Ctrl {
  40. fn get(&self) -> usize;
  41. fn set(&mut self, v: usize);
  42. }
  43.  
  44. impl Ctrl for MyCtrl {
  45. fn get(&self) -> usize {
  46. self.x + self.data.lock().borrow().len()
  47. }
  48.  
  49. fn set(&mut self, v: usize) {
  50. let data = self.data.clone();
  51. let mutex = self.lock.clone();
  52. thread::spawn(move || {
  53. let guard = mutex.try_lock();
  54. if let Ok(_v) = guard {
  55. thread::sleep(Duration::from_millis(1));
  56.  
  57. // trying to lock with main thread
  58. let data = data.lock();
  59. let mut data = data.borrow_mut();
  60. data.push(v);
  61. }
  62. });
  63. }
  64. }
  65.  
  66. trait Calc {
  67. fn calc(&mut self, ctrl: &mut impl Ctrl); // cannot change
  68. }
  69.  
  70. struct MyCalc {
  71. counter: usize
  72. }
  73.  
  74. impl Calc for MyCalc {
  75. fn calc(&mut self, ctrl: &mut impl Ctrl) {
  76. ctrl.set(ctrl.get());
  77. self.counter += 1;
  78. }
  79. }
  80.  
  81. fn main() {
  82. let calc = MyCalc{counter: 0};
  83. let ctrl = MyCtrl{
  84. x: 0,
  85. lock: Arc::new(Mutex::new(0)),
  86. data: Arc::new(ReentrantMutex::new(RefCell::new(vec![])))
  87. };
  88. let mut s = S{calc, ctrl};
  89.  
  90. s.process(&(0..2000).collect::<Vec<_>>());
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement