Các Arc<T>
documentation nói:Tại sao `Arc <T>` yêu cầu T là cả hai `Gửi` và` Đồng bộ hóa 'để có thể là `Gửi` /` Đồng bộ `?
impl<T> Sync for Arc<T> where T: Send + Sync + ?Sized
impl<T> Send for Arc<T> where T: Send + Sync + ?Sized
Một Arc
cho phép nhiều luồng đồng thời truy cập vào T
cơ bản thông qua một tài liệu tham khảo không thay đổi &T
. Điều này là an toàn miễn là T
không thể sửa đổi theo cách không đồng bộ qua &T
. Điều này đúng với tất cả các loại có 'khả năng đột biến được thừa kế' (gần như tất cả các loại) và sai cho các loại không đồng bộ 'khả năng đột biến nội bộ' (ví dụ: RefCell
, ...).
Theo như tôi hiểu, thì ràng buộc Send
không bắt buộc tại đây. Ví dụ: Tôi nghĩ rằng chia sẻ my artificial type which implements Sync
but not Send
trong một Arc
là an toàn.
Cuối cùng, &T
chính nó cũng không bị ràng buộc này! Trong tài liệu cho Send
và Sync
chúng ta thấy:
impl<'a, T> Send for &'a T where T: Sync + ?Sized
impl<'a, T> Sync for &'a T where T: Sync + ?Sized
Và như Arc<T>
cho phép người truy cập cùng với T
như &T
không, tôi không hiểu tại sao Arc<T>
có thêm Send
ràng buộc. Tại sao lại như vậy?
Tôi tự hỏi đây có phải là dấu tích còn lại khi 'Gửi' ngụ ý' tĩnh', vì việc chia sẻ dữ liệu qua các chuỗi yêu cầu 'tĩnh' trong thư viện chuẩn tại thời điểm này. –