4 个版本
使用旧的 Rust 2015
0.0.4 | 2015 年 5 月 19 日 |
---|---|
0.0.3 | 2015 年 2 月 2 日 |
0.0.2 | 2015 年 1 月 9 日 |
0.0.1 | 2015 年 1 月 2 日 |
#643 在 内存管理
24KB
457 行
shared_slice
线程局部和线程安全的共享切片类型,类似于 &[T]
,但没有生命周期。此库只依赖于 alloc
和 core
,因此可以在没有 std
的环境中使用。
lib.rs
:
线程局部和线程安全的共享切片类型,类似于 &[T]
,但没有生命周期。
此库只依赖于 alloc
和 core
,因此可以在没有 std
的环境中使用。
示例
Alice 有一个很长的数字列表,她需要在进入Wonderland之前将其求和。她迫不及待地想要到达那里,并且她有一台具有许多核心的计算机,因此她想要使用所有这些核心。
使用 ArcSlice
,她可以将数字手动分成块,并将它们分配到一些线程中。
#![feature(std_misc)]
extern crate shared_slice;
extern crate rand;
use shared_slice::arc::ArcSlice;
use std::{cmp, sync};
// Alice's numbers (the Mad Hatter doesn't care which numbers,
// just that they've been summed up).
let numbers = (0..10_000)
.map(|_| rand::random::<u64>() % 100)
.collect::<Vec<_>>();
const NTHREADS: usize = 10;
let numbers = ArcSlice::new(numbers.into_boxed_slice());
// number of elements per thread (rounded up)
let per_thread = (numbers.len() + NTHREADS - 1) / NTHREADS;
let mut futures = (0..NTHREADS).map(|i| {
// compute the bounds
let lo = i * per_thread;
let hi = cmp::min(numbers.len(), lo + per_thread);
// extract the subsection of the vector that we care about,
// note that the `clone` (which just increases the reference
// counts) is necessary because `ArcSlice::slice` consumes
// the receiver (in order to minimise unnecessary reference
// count modifications).
let my_numbers: ArcSlice<_> = numbers.clone().slice(lo, hi);
// do this part of the sum:
sync::Future::spawn(move || {
my_numbers.iter().fold(0, |a, &b| a + b)
})
}).collect::<Vec<sync::Future<u64>>>();
// sum up the results from each subsum.
let sum = futures.iter_mut().fold(0, |a, b| a + b.get());
println!("the sum is {}", sum);
(NB. ArcSlice
如果 Send
停止意味着 'static
,则在这种情况下可能变得不再必要,因为可能能够直接使用传统的借用 &[T]
切片。)