Tôi có một lớp chuỗi mà từ đó tôi muốn thỉnh thoảng có được một con trỏ một biến mẫu. Tôi muốn truy cập này được bảo vệ bởi một mutex để thread bị chặn truy cập vào tài nguyên này cho đến khi client kết thúc bằng con trỏ của nó.Làm cách nào để tạo một con trỏ thông minh có thể khóa và mở một mutex?
Cách tiếp cận ban đầu của tôi là trả về một cặp đối tượng: một con trỏ tới tài nguyên và một đối tượng shared_ptr cho đối tượng khóa trên mutex. Điều này shared_ptr giữ tham chiếu duy nhất để các đối tượng khóa để mutex nên được mở khóa khi nó đi ra khỏi phạm vi. Một cái gì đó như thế này:
void A::getResource()
{
Lock* lock = new Lock(&mMutex);
return pair<Resource*, shared_ptr<Lock> >(
&mResource,
shared_ptr<Lock>(lock));
}
Giải pháp này ít hơn lý tưởng vì nó yêu cầu khách hàng giữ toàn bộ cặp đối tượng. Hành vi như thế này phá vỡ sự an toàn chủ đề:
Resource* r = a.getResource().first;
Bên cạnh đó, thực hiện riêng của tôi về điều này được deadlocking và tôi đang gặp khó khăn xác định lý do tại sao, vì vậy có thể có những thứ khác xảy ra với nó.
Điều tôi muốn có là shared_ptr chứa khóa dưới dạng biến mẫu, ràng buộc nó bằng phương tiện để truy cập tài nguyên. Điều này có vẻ như một cái gì đó mà cần phải có một mô hình thiết kế được thành lập nhưng đã thực hiện một số nghiên cứu tôi ngạc nhiên khi thấy nó khá khó để đi qua.
Câu hỏi của tôi là:
- Có một thực hiện phổ biến của mô hình này?
- Có vấn đề gì với việc đặt một mutex bên trong shared_ptr mà tôi xem là ngăn chặn mẫu này lan rộng không?
- Có lý do chính đáng nào để không triển khai lớp shared_ptr của riêng tôi để triển khai mẫu này không?
(NB Tôi đang làm việc trên một codebase sử dụng Qt nhưng tiếc là không thể sử dụng tăng trong trường hợp này. Tuy nhiên, câu trả lời liên quan đến tăng vẫn là mối quan tâm chung.)
Cả hai câu trả lời từ đinh tán và Jonanthan Wakely đều thú vị và đáng giá sau. Tôi đang đi với Riz chỉ vì nó tốt đẹp để có một số mã chỉnh sửa cộng tác hoàn chỉnh trong một câu trả lời. –