#生命周期 #切片 #类型 #共享 #线程安全 #线程局部 #分配

nightly shared_slice

线程局部和线程安全的共享切片类型,类似于 &[T],但没有生命周期。此库只依赖于 alloccore,因此可以在没有 std 的环境中使用。

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内存管理

MIT/Apache

24KB
457

shared_slice

Build Status

线程局部和线程安全的共享切片类型,类似于 &[T],但没有生命周期。此库只依赖于 alloccore,因此可以在没有 std 的环境中使用。

文档

包列表


lib.rs:

线程局部和线程安全的共享切片类型,类似于 &[T],但没有生命周期。

此库只依赖于 alloccore,因此可以在没有 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] 切片。)

无运行时依赖