Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /********
- Не забудь добавить
- [dependencies]
- parking_lot = "0.2.5"
- scoped_threadpool = "0.1.7"
- в Cargo.toml
- ********/
- extern crate parking_lot;
- extern crate scoped_threadpool;
- use parking_lot::Mutex; // Можно использовать std::sync::Mutex, но они чуть медленней и занимают больше памяти. Если будешь их использовать добавь .unwrap() после каждого вызова .lock()
- use scoped_threadpool::Pool;
- use std::sync::Arc;
- // ...
- fn mass_make_par(&self, data: &Data) -> Item {
- // Тут вместо простого Item в мьютекс заносится Option<Item> из-за невозможности нормально вернуть из функции содержимое Arc'а
- // http://stackoverflow.com/a/29189079
- let result = Arc::new(Mutex::new(Some(Item::zero())));
- let mut pool = Pool::new(8);
- pool.scoped(|scope| {
- for maker in self.makers.iter() {
- let result = result.clone();
- scope.execute(move || {
- let make_result = maker.make(data);
- let mut result = result.lock();
- *result = Some(Item::compose(&result.take().unwrap(), &make_result));
- });
- }
- });
- let mut guard = result.lock();
- guard.take().unwrap()
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement