2015-10-14 13 views
11

Một mẫu cực kỳ phổ biến trong Rust là Arc<Mutex<T>>, trong đó Arc cung cấp quản lý bộ nhớ và Mutex cung cấp quyền truy cập đa luồng an toàn vào tài nguyên. Điều gì khác có thể được sử dụng thay cho Arc và trong hoàn cảnh nào?Khi nào bạn sử dụng một Mutex không có Arc?

Trả lời

17

Arc là khóa học phổ biến nhất trong ngữ cảnh này, nhưng có các loại con trỏ khác cho phép chia sẻ. Điểm chính (và phổ biến nhất, trong phần còn lại của Rust) là tham chiếu được chia sẻ &T. Điều này thường không làm việc với các chủ đề của std::thread::spawn 'd, bởi vì nó thường trỏ đến dữ liệu được kiểm soát bởi một số chủ đề khác, và do đó thường không phải là 'static (đặc biệt là khi nó là &Mutex<T>). Tuy nhiên, người ta có thể sử dụng scoped thread để tạo một chuỗi có thể chia sẻ dữ liệu với cha mẹ của nó. Ví dụ.

extern crate crossbeam; 
use std::sync::Mutex; 

fn main() { 
    let data = Mutex::new(vec![0, 1]); 

    crossbeam::scope(|scope| { 
     // these run concurrently: 
     let _guard = scope.spawn(|| { 
      data.lock().unwrap().push(2); 
     }); 
     data.lock().unwrap().push(3); 
    }); 

    println!("{:?}", *data.lock().unwrap()); 
    // one of [0, 1, 2, 3] or [0, 1, 3, 2] 
} 

Loại data trong việc đóng cửa truyền cho scope.spawn là trong thực tế &Mutex<Vec<i32>> (vì nó không có move từ khóa đóng cửa đang sử dụng phong cách chụp mặc định: bằng cách tham khảo).

&Arc là hai loại có thể đạt được loại chia sẻ an toàn luồng này trong thư viện/ngôn ngữ chuẩn, nhưng cũng có thể viết loại con trỏ cung cấp chia sẻ an toàn trong thư viện bên ngoài.

Tuy nhiên, di chuyển ra khỏi mẫu Pointer<Mutex<...>>, có thể hữu ích khi có mutex và chia sẻ được tách riêng, ví dụ: Arc<Vec<Mutex<T>>> cho phép một người chia sẻ một số số Mutex<T> 's mà không cần phải Arc mỗi một cá nhân, hoặc có thể ai muốn có một số trừu tượng xung quanh một Mutex, và do đó bọc nó trong một struct:

struct Wrapped { 
    data: Mutex<T> 
} 
impl Wrapped { 
    // fancy methods that abstract over `data.lock()` 
} 

Người ta sẽ có khả năng sau đó xem Arc<Wrapped> (hoặc một số con trỏ khác cho phép chia sẻ).

+2

liên kết đã chết fyi, theo trang thùng của họ: "Thùng này đã lỗi thời. Dự án Crossbeam hiện đang trong giai đoạn chuyển tiếp. Chúng tôi đang viết lại bộ thu rác epoch, cũng như một số tiện ích khác và thêm cấu trúc mới. Để theo dõi tiến độ, hãy xem các thùng khác trong dự án ở đây. Khi quá trình chuyển đổi hoàn tất, thùng này sẽ được cập nhật để sử dụng mã mới. " – EmmaGamma

Các vấn đề liên quan