nỗ lực ngây thơ của tôi là để làm một cái gì đó như thế này:
import std.typecons : Proxy:
synchronized class Array(T)
{
static import std.array;
private std.array.Array!T data;
mixin Proxy!data;
}
Đáng buồn thay, nó không hoạt động vì https://issues.dlang.org/show_bug.cgi?id=14509
Không thể nói rằng tôi rất ngạc nhiên mặc dù xử lý như automagical của đa luồng thông qua ẩn mutexes là rất unidiomatic trong D hiện đại và khái niệm rất của các lớp học đồng bộ chủ yếu là một relict từ D1 lần.
Bạn có thể thực hiện cùng một giải pháp thủ công, tất nhiên, bằng cách xác định lớp SharedArray
riêng với tất cả các phương pháp cần thiết và thêm khóa bên trong phương thức trước khi gọi phương thức riêng tư nội bộ Array
. Nhưng tôi đoán bạn muốn một cái gì đó làm việc nhiều hơn trong hộp.
Không thể phát minh ra bất cứ điều gì tốt hơn ngay bây giờ (sẽ nghĩ về nó nhiều hơn), nhưng cần lưu ý rằng nó được khuyến khích trong D để tạo cấu trúc dữ liệu được thiết kế để xử lý truy cập chia sẻ một cách rõ ràng thay vì chỉ bảo vệ dữ liệu bình thường cấu trúc với mutexes. Và, tất nhiên, cách tiếp cận được khuyến khích nhất là không chia sẻ dữ liệu nào cả bằng cách sử dụng thông điệp.
Tôi sẽ cập nhật câu trả lời nếu có điều gì tốt hơn cho tôi.
Nguồn
2015-04-27 02:19:23
Bảo vệ các mảng chính nó là dễ dàng. Bạn chỉ cần tạo một cấu trúc bao bọc với tất cả các hàm và toán tử mảng bị quá tải và nơi tất cả các hàm được đồng bộ hóa. Vấn đề là nhận được các phần tử của chính mảng đó. Việc bảo vệ chúng cũng trở nên phức tạp hơn nhiều, vì ngay sau khi bạn trả về chúng từ một hàm như 'opIndex', chúng không được bảo vệ nữa ... –
Tôi nghĩ đây là những gì' shared (T []) 'được cho là để làm, nhưng dường như không .... –
@ AdamD.Ruppe Tất cả chia sẻ thực sự làm là làm cho nó để biến được chia sẻ trên chủ đề chứ không phải là thread-local. Có một vài trường hợp trình biên dịch sẽ phàn nàn nếu bạn thử và làm việc với chia sẻ được đảm bảo là một vấn đề (trong một số trường hợp liên quan đến hoạt động nguyên tử IIRC), nhưng nó không làm bất cứ điều gì với mutexes hoặc đồng bộ hóa. Tùy ban. Các lớp được đồng bộ hóa là cách được khuyến nghị để xử lý các đối tượng được chia sẻ, nhưng chúng không được triển khai đầy đủ (chỉ các hàm đồng bộ) và bất cứ thứ gì thoát khỏi lớp đó sẽ không được bảo vệ nữa. –