2010-03-22 27 views
6

Có rất nhiều bài viết về lớp ReaderWriterLockSlim cho phép đọc nhiều và viết đơn. Tất cả những điều này (ít nhất là tôi đã tìm thấy) cho biết làm thế nào để sử dụng nó mà không có nhiều giải thích tại sao và làm thế nào nó hoạt động. Mẫu mã tiêu chuẩn là:.NET ReaderWriterLockSlim issues

lock.EnterUpgradeableReadLock(); 

try 
{ 
    if (test if write is required) 
    { 
     lock.EnterWriteLock(); 

     try 
     { 
      change the resourse here. 
     } 
     finally 
     { 
     lock.ExitWriteLock(); 
     } 
    } 
} 
finally 
{ 
    lock.ExitUpgradeableReadLock(); 
} 

Câu hỏi đặt ra là: nếu khóa có thể nâng cấp chỉ cho phép một chuỗi duy nhất để vào phần, thì tại sao tôi nên gọi phương thức EnterWriteLock? Điều gì sẽ xảy ra nếu tôi không? Hoặc điều gì sẽ xảy ra nếu thay vì EnterUpgradeableReadLock, tôi sẽ gọi EnterWriteLock và sẽ ghi vào tài nguyên mà không cần sử dụng khóa nâng cấp?

Trả lời

9

Ưu điểm của việc sử dụng EnterUpgradeableReadLock qua EnterReadLock là bạn có thể biết chắc chắn rằng điều kiện bạn nên kiểm tra để xác định xem có nên nhập khóa ghi hay không không thay đổi giữa kiểm tra điều kiện và thực sự đi vào viết khóa. Điều này tránh sự trùng lặp có thể cần thiết với thường xuyên lock s:

if (whatever-condition) 
{ 
    lock (_lockObject) 
    { 
     // the condition may have changed betwen the check and the lock; verify 
     // that the condition is still valid 
     if (whatever-condition) 
     { 
      // do the stuff 
     } 
    } 
} 

Đồng thời, nó không cuộc gọi khối EnterReadLock, vì vậy chủ đề khác có thể vẫn được đọc truy cập vào các bộ phận khác của mã (và tất nhiên, các cuộc gọi đó sẽ chặn cuộc gọi đến EnterWriteLock cho đến khi chúng phát hành khóa đọc).

+0

Xin cảm ơn tất cả! Khi tôi có thể chấp nhận một câu trả lời duy nhất, tôi đã chọn (chủ quan) cái này là thông tin nhất. – Kamarey

1

Lớp ReaderWriterLockSlim về cơ bản bao bọc khóa ghi và cho phép tất cả người đọc đọc miễn là khóa ghi không được giữ. Khi khóa ghi được giữ không có người đọc nào có thể đọc được.

Ý tưởng đằng sau EnterUpgradeableReadLock chỉ đơn giản là cho phép người lập trình nêu rõ ý định của họ và không vô tình sửa đổi nội dung.

pm100 - nhanh hơn vì khóa không độc quyền vì nhiều chủ đề có thể đọc cùng một lúc có thể tăng tốc độ đọc các ứng dụng nặng. Trong thực tế, nếu ứng dụng của bạn được viết nặng thì đây có thể không phải là giải pháp khóa tốt nhất cho bạn. Điều này làm việc tốt nhất khi sửa đổi hiếm khi được thực hiện nhưng nhiều lần đọc được yêu cầu.

+0

Bạn nói rằng EnterUpgradeableReadLock chỉ dành cho nhân chứng và lý thuyết có thể được thay thế bằng EnterWriteLock? – Kamarey

+0

Nội bộ. Nếu bạn chỉ cần sử dụng EnterWriteLock thì nó sẽ chặn bất kỳ người đọc nào để không làm điều này. – Chris

3

nếu giấy phép khóa nâng cấp chỉ là một chủ đề duy nhất để vào phần của nó, tại sao tôi nên gọi EnterWriteLock phương pháp bên trong?

EnterWriteLock sẽ chặn các chuỗi khác chỉ cần đọc - nếu bạn sử dụng khóa nâng cấp, các chủ đề khác vẫn có thể nhận được khóa đọc. Từ tài liệu EnterUpgradableLock:

Chỉ một chủ đề có thể vào chế độ nâng cấp tại bất kỳ thời điểm đã định nào. Nếu chuỗi là ở chế độ có thể nâng cấp và không có các đề xuất đang chờ để vào chế độ ghi, bất kỳ số lượng chủ đề nào khác có thể nhập chế độ đọc, ngay cả khi có chủ đề đang chờ để vào chế độ nâng cấp.

+0

Không EnterUpgradeableReadLock cũng chặn tất cả chuỗi cho đến khi thoát? – Kamarey

+0

Không, tôi sẽ cập nhật câu trả lời của mình với phần liên quan của tài liệu. –