在Interlocked.CompareExchange()之后读取值

问题描述 投票:-1回答:1

假设我有一些基类

public abstract class ReflectionSupport
{
    private const int UnresolvedFieldsFlag = -1;
    private const int TrueFieldsFlag = 1;
    private const int FalseFieldsFlag = 0;

    // flag holder
    private int _flagHasFields = UnresolvedFieldsFlag;

    // variant 1 
    protected bool HasFields
    {
       get
       {
          Interlocked.CompareExchange(ref _flagHasFields, ResolveHasFieldsFlag(), UnresolvedFieldsFlag);
          return (TrueFieldsFlag == Volatile.Read(ref _flagHasFields));
       }
    }

    // variant 2
    protected bool HasFields
    {
         get
         {
             Interlocked.CompareExchange(ref _flagHasFields, ResolveHasFieldsFlag(), UnresolvedFieldsFlag);
             return (TrueFieldsFlag == _flagHasFields);
         }
    }

    private int ResolveHasFieldsFlag()
    { 
         // here reflection is used 
         // to analyze current instance 
         // and returns TRUE-flag if instance 
         // contains field
    }
}

我的问题 - 我应该在Interlocked.CompareExchange()之后使用什么变体HasFields属性。存储在字段中的标志值是Interlocked操作后的最新值还是我必须使用volatile读取?

c# .net multithreading
1个回答
0
投票

根据您的评论信息,您可以通过以下方式使用Lazy

public abstract class ReflectionSupport
{
    private readonly Lazy<bool> _hasFields;
    protected bool HasFields => _hasFields.Value;

    protected ReflectionSupport()
    {
        _hasFields = new Lazy<bool>(HasFieldsFlag);
    }

    private bool HasFieldsFlag()
    { 
        // just return true if instance 
        // contains field
    }
}

如你所见,UnresolvedFieldsFlag不再需要,所以可以用bool代替

© www.soinside.com 2019 - 2024. All rights reserved.