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
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).
&
và 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ẻ).
- 1. lỗi khi sử dụng mutex
- 2. Khi nào nên sử dụng mutex đệ quy?
- 3. ARC có cho tôi biết khi nào tôi phải sử dụng __block không?
- 4. Objective C - ARC - Khi sử dụng @autoreleasepool
- 5. Trình biên dịch có điều kiện khi sử dụng ARC
- 6. Sử dụng mutex tĩnh trong một lớp
- 7. Sử dụng nhiều khóa mutex
- 8. Sử dụng mutex làm semaphore?
- 9. Sử dụng mã không phải ARC trong dự án có hỗ trợ ARC - Thêm Facebook
- 10. Tạo Mutex bị treo trong khi sử dụng mạo danh
- 11. Khi nào bạn nên sử dụng JCR và khi nào bạn nên sử dụng JPA/RDBMS?
- 12. ARC có phát hành bộ nhớ malloc'ed cho bạn không?
- 13. @autoreleasepool không có ARC?
- 14. Khi nào chúng ta nên sử dụng mutex và khi nào chúng ta nên sử dụng semaphore
- 15. Có thể có ứng dụng iOS không được bật ARC nhưng có một số tệp arc không?
- 16. Khi nào bạn sử dụng PendingIntent?
- 17. Sử dụng objc_getClassList dưới arc
- 18. Đây có phải là cách sử dụng đúng đắn của một mutex không?
- 19. Khi sử dụng setTimeout bạn có phải clearTimeout không?
- 20. EXC_BAD_ACCESS chỉ sử dụng ARC trong khi thử nghiệm
- 21. Sử dụng đúng các mutex trong Python
- 22. ARM cortex: mutex sử dụng chút dải
- 23. Tôi có cần một mutex để đọc không?
- 24. Cách sử dụng mutex trong Visual Basic
- 25. Bạn có sử dụng Phing không?
- 26. Bạn có thể khởi chạy ứng dụng android dưới dạng ứng dụng ARC thông qua Android studio không?
- 27. Bạn có sử dụng OData hay không?
- 28. Khi sử dụng các API RESTful, khi nào bạn nên sử dụng RestSharp và khi HttpClient?
- 29. Phát hành một Mutex
- 30. Trở đối tượng autoreleased sử dụng ARC
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