Generic Threadsafe Property

后端 未结 1 1112
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-08 23:09

I have created this \"threadsafe\" generic property, that i can use between the main thread and a background Thread. I made it because i was tired of creating Lock-Objects f

相关标签:
1条回答
  • 2020-12-09 00:11

    Your code is fine and will serialize read/write access to the property. The only comment that I would make is that you do not need to create a separate lock object. You can remove PropLock and lock on Self instead.

    I have an almost identical class in my code base. The only differences are:

    1. I use a critical section rather than TMonitor because I still don't trust TMonitor. The early versions had a number of bugs and that dented my confidence. However, I suspect that the TMonitor code is most likely correct by now. So I see no reason for you to change.
    2. I use try/finally with the code that locks and unlocks. This is perhaps a little pessimistic on my part, because it's hard to see how you could usefully recover from exceptions in the getter and setter methods. Force of habit I suppose.

    FWIW, my version of your class looks like this:

    type
      TThreadsafe<T> = class
      private
        FLock: TCriticalSection;
        FValue: T;
        function GetValue: T;
        procedure SetValue(const NewValue: T);
      public
        constructor Create;
        destructor Destroy; override;
        property Value: T read GetValue write SetValue;
      end;
    
    { TThreadsafe<T> }
    
    constructor TThreadsafe<T>.Create;
    begin
      inherited;
      FLock := TCriticalSection.Create;
    end;
    
    destructor TThreadsafe<T>.Destroy;
    begin
      FLock.Free;
      inherited;
    end;
    
    function TThreadsafe<T>.GetValue: T;
    begin
      FLock.Acquire;
      Try
        Result := FValue;
      Finally
        FLock.Release;
      End;
    end;
    
    procedure TThreadsafe<T>.SetValue(const NewValue: T);
    begin
      FLock.Acquire;
      Try
        FValue := NewValue;
      Finally
        FLock.Release;
      End;
    end;
    

    I guess there's really just one way to write this class!

    0 讨论(0)
提交回复
热议问题