Advertisement
Guest User

Untitled

a guest
May 31st, 2016
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.37 KB | None | 0 0
  1. /********
  2. Не забудь добавить
  3.  
  4. [dependencies]
  5. parking_lot = "0.2.5"
  6. scoped_threadpool = "0.1.7"
  7.  
  8. в Cargo.toml
  9.  
  10. ********/
  11.  
  12. extern crate parking_lot;
  13. extern crate scoped_threadpool;
  14.  
  15. use parking_lot::Mutex; // Можно использовать std::sync::Mutex, но они чуть медленней и занимают больше памяти. Если будешь их использовать добавь .unwrap() после каждого вызова .lock()
  16. use scoped_threadpool::Pool;
  17. use std::sync::Arc;
  18.  
  19. // ...
  20.  
  21. fn mass_make_par(&self, data: &Data) -> Item {
  22.     // Тут вместо простого Item в мьютекс заносится Option<Item> из-за невозможности нормально вернуть из функции содержимое Arc'а
  23.     // http://stackoverflow.com/a/29189079
  24.     let result = Arc::new(Mutex::new(Some(Item::zero())));
  25.     let mut pool = Pool::new(8);
  26.     pool.scoped(|scope| {
  27.         for maker in self.makers.iter() {
  28.             let result = result.clone();
  29.             scope.execute(move || {
  30.                 let make_result = maker.make(data);
  31.                 let mut result = result.lock();
  32.                 *result = Some(Item::compose(&result.take().unwrap(), &make_result));
  33.             });
  34.         }
  35.     });
  36.     let mut guard = result.lock();
  37.     guard.take().unwrap()
  38. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement