Trên cuối đối diện, hầu hết các mã đa luồng của tôi đòi hỏi việc sử dụng các mutable
keyword:
class object {
type m_data;
mutable mutex m_mutex;
public:
void set(type const & value) {
scoped_lock lock(m_mutex);
m_data = value;
}
type get() const {
scoped_lock lock(m_mutex);
return m_data;
}
};
Thực tế là phương pháp get
không thay đổi trạng thái của object
được khai báo bằng phương tiện từ khóa const
.Nhưng nếu không có công cụ sửa đổi mutable
được áp dụng cho việc khai báo thuộc tính mutex
, mã sẽ không thể khóa hoặc giải phóng hoạt động mutex - rõ ràng sửa đổi số mutex
, ngay cả khi chúng không sửa đổi object
.
Bạn thậm chí có thể làm cho thuộc tính data
có thể thay đổi nếu nó có thể được đánh giá lazily và chi phí cao, miễn là bạn khóa đối tượng. Đây là sử dụng bộ nhớ cache mà bạn tham chiếu trong câu hỏi.
Công cụ sửa đổi mutable
không phải là vấn đề với mã đa luồng, chỉ khi bạn cố gắng khóa ít hơn đa luồng. Và như với tất cả các chương trình khóa-ít hơn, bạn phải là rất cẩn thận với những gì bạn làm, bất kể const
hoặc mutable
. Bạn có thể viết mã đa luồng hoàn toàn không an toàn gọi các phương thức const
trên các đối tượng không có thuộc tính mutable
. Ví dụ đơn giản sẽ loại bỏ các mutex từ mã trước đó và có N chủ đề thực hiện chỉ get()
s trong khi một thread khác thực hiện set()
s. Thực tế là get()
là const không đảm bảo rằng bạn sẽ không nhận được kết quả không hợp lệ nếu một luồng khác đang sửa đổi.
Nguồn
2011-01-07 19:45:26
Tôi có thể nói bạn thực sự hiểu nhầm từ khóa 'có thể thay đổi '. Bạn lấy ý tưởng này ở đâu để ảnh hưởng đến bộ nhớ đệm dữ liệu? –
@ Jonathan: Caching dữ liệu là việc sử dụng rất phổ biến của các thành viên dữ liệu 'mutable'. Nếu bạn có một hàm thành viên thực hiện một số nhiệm vụ tốn kém và bạn biết rằng hàm này được gọi thường xuyên, một tối ưu hóa điển hình là giới thiệu một thành viên dữ liệu có thể thay đổi để lưu trữ kết quả của tác vụ tốn kém để các cuộc gọi trong tương lai tới chức năng thành viên đó nhanh hơn . –
Có, nhưng đó là trường hợp sử dụng, không phải là ý nghĩa của từ khóa. –