Advertisement
Guest User

Untitled

a guest
Nov 4th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 1.18 KB | None | 0 0
  1. use std::sync::mpsc;
  2.  
  3. use num_cpus;
  4. use num_bigint::BigInt;
  5. use num_traits::One;
  6. use rand::prelude::*;
  7.  
  8. use threadpool::ThreadPool;
  9.  
  10. /// Подсчет по формуле с помощью потоков внешней матрицы
  11. pub fn calculate(k: usize, n: usize) -> BigInt {
  12.     let mut multiply: BigInt = One::one();
  13.     // пул потоков
  14.     let pool = ThreadPool::new(num_cpus::get());
  15.     // канал для общения потоков
  16.     let (tx, rx) = mpsc::channel();
  17.     for _ in 0..k {
  18.         let tx = tx.clone();
  19.         // запуск потока в пуле
  20.         pool.execute(move || {
  21.             let mut rng = thread_rng();
  22.             let mut sum = 0;
  23.             for _ in 0..n {
  24.                 let value: u32 = rng.gen_range(1, 10);
  25.                 sum += value.pow(3);
  26.             }
  27.             // отправление результата в канал
  28.             tx.send(sum).expect("Ошибка при отпр.");
  29.         });
  30.     }
  31.     for _ in 0..k {
  32.         let sum = rx.recv().expect("Ошибка при пол.");
  33.         multiply *= sum;
  34.     }
  35.     // возвращаем результат
  36.     multiply
  37. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement