2008-11-19 27 views
6

Tôi có một wrapper danh sách đó duy trì hai Tstringlists và TClassListLàm cách nào để triển khai trình bao bọc danh sách an toàn chỉ trong Delphi?

tôi cần điều này được đề an toàn, ví dụ rằng:

  • viết đồng thời không được phép (chờ nhà nước của một số loại nên được nhập)
  • Reading trong khi viết (hoặc ngược lại) là không được phép (chờ nhà nước của một số loại nên được nhập)
  • đồng thời đọc phép

Bất kỳ ý tưởng nào về cách tôi có thể thực hiện việc này? Bản năng của tôi nói với tôi rằng nó cần nhiều hơn chỉ là một phần quan trọng, có lẽ là một semaphore hoặc "truy cập sử dụng", có lẽ một trong số này trong kết hợp với CS.

Tôi không hoàn toàn chắc chắn bắt đầu từ đâu - bất kỳ điều gì từ cách tiếp cận tổng thể bằng tiếng Anh sang psuedo-code, để triển khai delphi hoặc liên kết bên ngoài sẽ được đánh giá cao.

Trả lời

12

Bạn nên có một cái nhìn tại các lớp TMultiReadExclusiveWriteSynchronizer khai báo trong sysutils.pas ...

+1

Có lẽ tên lớp dài nhất trong RTL :) – Serguzest

+0

chúng có thể dễ dàng gọi nó là TMREWS – Steve

+5

Chúng có thể dễ dàng gọi nó là TGreenIdea và truyền tải nhiều thông tin như TMREWS. Đừng sợ tên định danh dài. –

5

Hãy nhìn vào hướng dẫn này. Threading the Delphi Way

Xem chương 11, nhưng đó là tất cả những thứ hay.

+0

Liên kết tuyệt vời. Có thể đã sử dụng điều này khi tôi đã làm nhiều hơn ở Delphi một vài năm trước đây! – JamesSugrue

+0

+1 cho liên kết tuyệt vời đó! –

2

Bạn thực sự nên xem TThreadList.

Phương thức .Thêm, .Xóa, .Xóa tự động khóa danh sách cho bạn. Nếu cần, bạn cũng có thể khóa/mở khóa khi cần:

x.LockList; 
try 
    //do whatever 
finally 
    x.Unlocklist; 
end; 

TMultiReadExclusiveWriteSynchronizer là một ý tưởng tuyệt vời nhưng tôi không biết liệu chúng có bao giờ khắc phục tất cả các lỗi không. Nó luôn luôn có vấn đề dưới tải.

+1

Đó không phải là những gì OP mong muốn, vì LockList() khóa danh sách truy cập độc quyền - truy cập đọc song song do đó là không thể. – mghie

+2

Tôi hoàn toàn không biết rằng TThreadList thậm chí còn tồn tại cho đến bây giờ. Tôi đã sử dụng các đối tượng TStringList với tất cả các loại CriticalSections trong mã của tôi. Điều này sẽ làm cho cuộc sống đơn giản hơn nhiều! – Mick

Các vấn đề liên quan