有大师帮忙分析下这个类吗?我看出是一个索引,但是具体功能和作用还是没有完全吃透,有人能帮帮忙吗?
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;
}
}
}
用一个 32 位整形来存储 32 个标识符,如果该位是 1 的话,表示 true,为 0 表示 false。
为了保证对 _data 的修改线程安全,所以使用了 volatile 和 Interlocked 。
private SafeBitVector32 _flags;
protected void InitializationComplete()
{
this._flags[1] = true;
if (this._flags[2])
{
this.Dispose();
}
}
这个类的具体运用在这里,这里代表什么意思呢?
@412742171:
_flags 的第 1 位设置为 true,如果 _flags 的第 2 位为 true,那么就调用 Dispose 方法。
@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);}作用是啥呢?
@412742171: 这段代码的作用可以用下面这段你应该能看懂的代码来阐述:
lock(this)
{
this._data = value ? (this._data | bit) : (this._data & ~bit);
}
上面的代码使用了锁,在并发度没有足够高的情况下,它极大的浪费了资源,因此你给出的代码使用了 lock-free 的方式来实现,资源消耗极低,且同 lock 一样线程安全。
@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;
}
是不是可行呢?(貌似看起来肯定错了,但是为什么它要那么写呢?)
@Launcher: 真是不好意思啊,打扰了,这些代码都没见过,一头雾水啊。还望指教一二。
@412742171: 我建议你找本《C程序设计》学习下,除了 lock-free 的实现是书本上没有的知识,其它的都是计算机学科的基础知识。
@Launcher: 恩,好的,谢谢兄弟了。