gpt4 book ai didi

c# - Task.IsCompleted 使用缓存标志的原因是什么?

转载 作者:行者123 更新时间:2023-12-03 09:33:22 25 4
gpt4 key购买 nike

我正在查看 System.Threading.Tasks(.NET 标准 2.0)中 Task 的一些实现细节,我发现了这段有趣的代码:

internal volatile int m_stateFlags;

...

public bool IsCompleted
{
get
{
int stateFlags = m_stateFlags; // enable inlining of IsCompletedMethod by "cast"ing away the volatiliy
return IsCompletedMethod(stateFlags);
}
}

// Similar to IsCompleted property, but allows for the use of a cached flags value
// rather than reading the volatile m_stateFlags field.
private static bool IsCompletedMethod(int flags)
{
return (flags & TASK_STATE_COMPLETED_MASK) != 0;
}

我从阅读 C# 引用指南中了解到 volatile 是为了防止编译器/运行时/硬件优化会导致对字段的读/写重新排序。为什么在这种特定情况下将字段指定为 volatile 只是为了在通过将其分配给变量来读取字段时忽略波动?

这似乎是有意的,但我不清楚意图背后的原因。
此外,“抛弃”波动性是一种常见做法吗?在哪些情况下我想这样做与我绝对想避免它的情况?

非常感谢任何帮助我更清楚地理解这段代码的信息。

谢谢,

最佳答案

volatilea syntax sugar of Volatile.Read and Volatile.Write .它确保任何 CPU 将同时看到相同的数据。

所以它只读取一次 volatile 变量。然后这可以在属性,方法中多次使用(失去 volatile )。所以它看起来像是对变量进行了快照并对其值进行了多次计算。

internal volatile int m_stateFlags;

public bool IsCompleted
{
get
{
int stateFlags = m_stateFlags;
return IsCompletedMethod(stateFlags);
}
}

关于c# - Task.IsCompleted 使用缓存标志的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60874269/

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