Я просматривал некоторые детали реализации Task в System.Threading.Tasks (. NET standard 2.0) и наткнулся на этот интересный фрагмент кода:
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 для предотвращения оптимизации компилятора / среды выполнения / аппаратного обеспечения, которая может привести к переупорядочению операций чтения / записи в поле. Зачем в этом конкретном случае c указывать поле как volatile, чтобы игнорировать его при чтении, назначая его переменной?
Кажется, намеревался, но причина этого неясна для меня. Кроме того, «отбрасывание» волатильности - обычная практика? В каком сценарии ios я бы хотел сделать это по сравнению со сценарием ios Я абсолютно хочу этого избежать?
Любая информация, которая поможет мне понять этот фрагмент кода, более ценится.
Спасибо,