2010-04-08 24 views
7

Như tôi được biết, có hai loại phổ biến của thực tiễn để đảm bảo sự an toàn thread lười biếng-khởi:Có thể hoặc hợp lý để thực hiện khóa kiểm tra kép ở Delphi?

  1. đúp kiểm tra khóa (Marks biến như dễ bay hơi để tránh đặt bộ nhớ)
  2. InterlockedCompareExchangePointer

Dường như VCL sử dụng phương pháp thứ hai. Có lý do gì không?

class function TEncoding.GetUTF8: TEncoding; 
var 
    LEncoding: TEncoding; 
begin 
    if FUTF8Encoding = nil then 
    begin 
    LEncoding := TUTF8Encoding.Create; 
    if InterlockedCompareExchangePointer(Pointer(FUTF8Encoding), LEncoding, nil) <> nil then 
     LEncoding.Free; 
    end; 
    Result := FUTF8Encoding; 
end; 

hoặc có phương pháp nào tốt hơn không?

Cảm ơn!

Trả lời

4

Không có nhiều sự khác biệt về tốc độ. Trong cả hai cách tiếp cận, trường toàn cục được kiểm tra đầu tiên nếu nó được khởi tạo và khởi tạo chỉ được thực hiện khi được yêu cầu. Do đó, phần lớn thời gian hàm sẽ chỉ làm so sánh, nhảy, di chuyển, mà không có bất kỳ khởi tạo nào.

Khi khởi tạo được thực hiện, InterlockedCompareEtc có hai ưu điểm so với khóa.

  1. Nhanh hơn.
  2. Mã ngắn hơn (không cần phải khởi tạo khóa vv).

Tôi tìm cách tiếp cận InterlockedCompareEtc "neater" và sử dụng nó trong mã của mình. Nhưng khóa sẽ hoạt động tốt như nhau.

+0

Tôi không thích sự trùng lặp mã, vì vậy tôi có một số ý kiến ​​cho rằng có thể đơn giản hóa các mã trên: 1. Khi loại param "T" có constructor mặc định Result: = TUtils.GetInstance (FUTF8Encoding, TUTF8Encoding); 2. Sử dụng một phương thức ẩn danh để tạo một cá thể cục bộ. Kết quả: = TUtils.GetInstance (FUTF8Encoding, chức năng: Mã hóa bắt đầu Kết quả: = TUTF8Encoding.Create; kết thúc); Làm thế nào về điều đó? –

+0

Bạn nên chỉnh sửa bài đăng gốc, Paul, thay vì viết nhận xét. – gabr

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