Tôi phải thiết kế cấu trúc dữ liệu được sử dụng trong môi trường nhiều luồng. API cơ bản rất đơn giản: chèn phần tử, loại bỏ phần tử, truy lục phần tử, kiểm tra phần tử đó tồn tại. Việc triển khai cấu trúc sử dụng khóa ẩn để đảm bảo nguyên tử của một cuộc gọi API duy nhất. Sau khi tôi thực hiện điều này nó trở nên rõ ràng, rằng những gì tôi thực sự cần là atomicity trên một số cuộc gọi API. Ví dụ, nếu một người gọi cần phải kiểm tra sự tồn tại của một phần tử trước khi cố gắng để chèn nó anh ta không thể làm điều đó nguyên tử ngay cả khi mỗi API cuộc gọi duy nhất là nguyên tử:Thiết kế cấu trúc dữ liệu an toàn chủ đề
if(!data_structure.exists(element)) {
data_structure.insert(element);
}
Ví dụ có phần vụng về, nhưng điểm cơ bản là chúng ta không thể tin tưởng kết quả của cuộc gọi "tồn tại" nữa sau khi chúng ta trở về từ ngữ cảnh nguyên tử (hội đồng được tạo ra rõ ràng cho thấy một cơ hội nhỏ của chuyển đổi ngữ cảnh giữa hai cuộc gọi).
Điều tôi hiện có trong đầu để giải quyết vấn đề này là để lộ khóa thông qua API công khai của cấu trúc dữ liệu. Bằng cách này, khách hàng sẽ phải khóa mọi thứ một cách rõ ràng, nhưng ít nhất họ sẽ không phải tự tạo khóa của mình. Có một giải pháp phổ biến hơn cho các loại vấn đề này không? Và miễn là chúng tôi đang ở đó, bạn có thể tư vấn cho một số tài liệu tốt về thiết kế an toàn thread?
EDIT: Tôi có một ví dụ tốt hơn. Giả sử rằng truy xuất phần tử trả về một tham chiếu hoặc một con trỏ đến phần tử được lưu trữ và không phải là bản sao của nó. Làm thế nào người gọi có thể được bảo vệ để sử dụng một cách an toàn con trỏ này \ tham khảo sau khi cuộc gọi trả về? Nếu bạn nghĩ rằng không trả lại bản sao là một vấn đề, thì hãy nghĩ về các bản sao sâu, tức là các đối tượng cũng nên sao chép các đối tượng khác mà chúng trỏ đến nội bộ.
Cảm ơn bạn.
Giới thiệu về bạn chỉnh sửa: Hãy suy nghĩ về tình huống, nơi con trỏ đến phần tử được lưu trữ được trả lại và chuỗi khác cố gắng xóa phần tử này khỏi data_structture. Bạn ít nhất cần phải chọn hành vi nào nên được thực hiện theo quan điểm của mô hình khóa. Trả về lỗi cho chuỗi đang cố xóa đối tượng? chờ đối tượng trở nên không được quan tâm, vv .. – drlazy