相关疑难解决方法(0)

在没有锁定的保证64位体系结构上实现long属性的线程安全原子访问器的最佳方法

我有一个属性类型很长的属性(Int64).

如果它是一个int,那么我可以将支持字段声明为:

private volatile int _myInt;
Run Code Online (Sandbox Code Playgroud)

并创建一个简单的get和set访问器.

但是,即使使用x64项目设置,C#编译器也不允许使用类型为long的volatile关键字.所以情况是,即使我们确定读/写操作在这个变量上都是原子的,不幸的是,读取变量的线程有可能获得并使用旧的方式(处理器或CLR/JIT优化器)缓存值...

问题1:这是否意味着我不必简单地在get访问器中读取此值,而是使用Interlocked来防止读取缓存值?

get
{
    return Interlocked.CompareExchange(ref _myLong, 0, 0);
}
Run Code Online (Sandbox Code Playgroud)

这意味着一个相当开销......

问题2:仍然假设有保证的64位架构,在集合访问器中是否足够简单,如:

set
{
    _myLong = value;
}
Run Code Online (Sandbox Code Playgroud)

提前致谢

.net c# multithreading

1
推荐指数
1
解决办法
300
查看次数

标签 统计

.net ×1

c# ×1

multithreading ×1