How to easy make this counter property thread safe?

前端 未结 5 2344
陌清茗
陌清茗 2021-02-20 08:31

I have property definition in class where i have only Counters, this must be thread-safe and this isn\'t because get and set is not in same lock, How t

5条回答
  •  野趣味
    野趣味 (楼主)
    2021-02-20 09:25

    If you're looking to implement the property in such a way that DoneCounter = DoneCounter + 1 is guaranteed not to be subject to race conditions, it can't be done in the property's implementation. That operation is not atomic, it actually three distinct steps:

    1. Retrieve the value of DoneCounter.
    2. Add 1
    3. Store the result in DoneCounter.

    You have to guard against the possibility that a context switch could happen in between any of those steps. Locking inside the getter or setter won't help, because that lock's scope exists entirely within one of the steps (either 1 or 3). If you want to make sure all three steps happen together without being interrupted, then your synchronization has to cover all three steps. Which means it has to happen in a context that contains all three of them. That's probably going to end up being code that does not belong to whatever class contains the DoneCounter property.

    It is the responsibility of the person using your object to take care of thread safety. In general, no class that has read/write fields or properties can be made "thread-safe" in this manner. However, if you can change the class's interface so that setters aren't necessary, then it is possible to make it more thread-safe. For example, if you know that DoneCounter only increments and decrements, then you could re-implement it like so:

    private int _doneCounter;
    public int DoneCounter { get { return _doneCounter; } }
    public int IncrementDoneCounter() { return Interlocked.Increment(ref _doneCounter); }
    public int DecrementDoneCounter() { return Interlocked.Decrement(ref _doneCounter); }
    

提交回复
热议问题