gpt4 book ai didi

c# - .NET 中的后续写入能否由运行时或处理器重新排序?

转载 作者:太空狗 更新时间:2023-10-30 00:51:42 24 4
gpt4 key购买 nike

我有不可变对象(immutable对象),我希望延迟计算其哈希码。我已经实现了

private bool _HasHashCode = false;
private int _HashCode;
public override int GetHashCode()
{
if (_HasHashCode)
return _HashCode;

long hashCode;
unchecked
{
hashCode = Digits;
hashCode = (hashCode*397) ^ XI;
hashCode = (hashCode*397) ^ YI;
hashCode = (int) ( hashCode % Int32.MaxValue);
}

// is it possible that these two write instructions
// get reordered on a certain .NET/CPU architecture
// combination:

_HashCode = (int)hashCode;
_HasHashCode = true;

return _HashCode;
}

我的推理是 32 位 _HashCode 成员是 32 位并且写入它是原子的,所以即使计算由于设置 _HasHashCode 属性的竞争条件而运行两次,它也不会matter 因为每次都会计算相同的值。

我担心 CLR 可能会重新排序写入 _HashCode_HasHashCode。这是一个问题还是我可以确定 CLR 不会重新排序写入?

最佳答案

这里有一个懒惰的方法:回避问题,回避问题。例如,只有在有两个“事物”时才需要考虑重新排序 - 一个“事物”永远不会乱序。您可以牺牲标记值 0 来表示“尚未计算”——然后作为计算的最后一步,避免使用标记:

int hash;
public override int GetHashCode()
{
var snapshot = hash;
if(snapshot == 0) // means: not yet calculated
{
// snapshot = ... your actual implementation

if(snapshot == 0) snapshot = -124987; // avoid sentinel value
hash = snapshot;
}
return snapshot;
}

请注意,int 读取和写入保证是原子的,这也有帮助。

关于c# - .NET 中的后续写入能否由运行时或处理器重新排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25519986/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com