基本算术运算是线程安全的吗?
例如,如果有++
对全局变量的操作,会被不同线程修改,是否有必要在它周围加锁?
例如
void MyThread() // can have many running instances
{
aGlobal++;
}
或者应该是
void MyThread()
{
lock( lockerObj)
{
aGlobal++;
}
}
The spec总结得很好。第 5.5 节,“变量引用的原子性”:
以下数据类型的读取和写入是原子的:bool、char、
byte、sbyte、short、ushort、uint、int、float 和引用类型。在
另外,读取和写入具有基础类型的枚举类型
前面的列表也是原子的。读取和写入其他类型,
包括long、ulong、double、decimal以及用户自定义
类型,不保证是原子的。除了图书馆
为此目的而设计的函数,不能保证原子性
读-修改-写,例如递增或递减的情况。
结论:
- 独立读/写是原子的(但仅适用于某些数据类型)
- 读/修改/写(如
i++
) is never atomic
- 您可以使用Interlocked当尚未保证原子性时,类方法可以实现原子性
在以下情况下Interlocked
功能还不够,除了使用同步原语之外没有其他选择,例如Monitor.Enter(编译器还通过lock
陈述)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)