首页 新闻 会员 周边

有大师帮我分析下这个类的作用吗?System.Runtime.Caching.SafeBitVector32

0
[待解决问题]

有大师帮忙分析下这个类吗?我看出是一个索引,但是具体功能和作用还是没有完全吃透,有人能帮帮忙吗?

    internal struct SafeBitVector32
    {
        private volatile int _data;
        internal bool this[int bit]
        {
            get
            {
                int data = this._data;
                return (data & bit) == bit;
            }
            set
            {
                int data;
                int num;
                do
                {
                    data = this._data;
                    int value2;
                    if (value)
                    {
                        value2 = (data | bit);
                    }
                    else
                    {
                        value2 = (data & ~bit);
                    }
                    num = Interlocked.CompareExchange(ref this._data, value2, data);
                }
                while (num != data);
            }
        }
        internal bool ChangeValue(int bit, bool value)
        {
            while (true)
            {
                int data = this._data;
                int num;
                if (value)
                {
                    num = (data | bit);
                }
                else
                {
                    num = (data & ~bit);
                }
                if (data == num)
                {
                    break;
                }
                int num2 = Interlocked.CompareExchange(ref this._data, num, data);
                if (num2 == data)
                {
                    return true;
                }
            }
            return false;
        }
    }
}

412742171的主页 412742171 | 菜鸟二级 | 园豆:210
提问于:2014-02-19 11:40
< >
分享
所有回答(1)
0

用一个 32 位整形来存储 32 个标识符,如果该位是 1 的话,表示 true,为 0 表示 false。

为了保证对 _data 的修改线程安全,所以使用了 volatile 和 Interlocked 。

Launcher | 园豆:45045 (高人七级) | 2014-02-19 11:51

     private SafeBitVector32 _flags; 

     protected void InitializationComplete()
        {
            this._flags[1] = true;
            if (this._flags[2])
            {
                this.Dispose();
            }
        }

 

这个类的具体运用在这里,这里代表什么意思呢?

支持(0) 反对(0) 412742171 | 园豆:210 (菜鸟二级) | 2014-02-19 12:08

@412742171: 

_flags 的第 1 位设置为 true,如果 _flags 的第 2 位为 true,那么就调用 Dispose 方法。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-02-19 13:01

@Launcher: this._flags[1] = true;这个时候,set里面的这部分代码{

                    data = this._data;
                    int value2;
                    if (value)
                    {
                        value2 = (data | bit);
                    }
                    else
                    {
                        value2 = (data & ~bit);
                    }
                    num = Interlocked.CompareExchange(ref this._data, value2, data);
                }
                while (num != data);}作用是啥呢?

支持(0) 反对(0) 412742171 | 园豆:210 (菜鸟二级) | 2014-02-19 14:57

@412742171: 这段代码的作用可以用下面这段你应该能看懂的代码来阐述:

lock(this)

{

   this._data = value ? (this._data | bit) : (this._data & ~bit);

}

上面的代码使用了锁,在并发度没有足够高的情况下,它极大的浪费了资源,因此你给出的代码使用了 lock-free 的方式来实现,资源消耗极低,且同 lock 一样线程安全。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-02-19 15:18

@Launcher: 哦!这个lock我还没发现,谢谢指明,我一会儿再研究研究这个。

我就觉得,第一次 this._flags[1] = true 的时候。

第一,在set代码里,this._data好像还没有赋值,那data = this._data; value2 = (data | bit);这里的bit可以进行|运算吗?

第二,value2 = (data | bit),为啥这里一定要进行|运算呢?目的是什么?

第三,如果把get,set改成这个呢?

get{

      if(this._data == bit);
      return ture;

      else return false;

}

set{                   

      if (value)
         {
            this._data = bit
          }

         else

         {

           this._data =-1;

          }

是不是可行呢?(貌似看起来肯定错了,但是为什么它要那么写呢?)

支持(0) 反对(0) 412742171 | 园豆:210 (菜鸟二级) | 2014-02-19 15:49

@Launcher: 真是不好意思啊,打扰了,这些代码都没见过,一头雾水啊。还望指教一二。

支持(0) 反对(0) 412742171 | 园豆:210 (菜鸟二级) | 2014-02-19 15:51

@412742171: 我建议你找本《C程序设计》学习下,除了 lock-free 的实现是书本上没有的知识,其它的都是计算机学科的基础知识。

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-02-19 16:41

@Launcher: 恩,好的,谢谢兄弟了。

支持(0) 反对(0) 412742171 | 园豆:210 (菜鸟二级) | 2014-02-19 16:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册