Читая этот вопрос , я хотел проверить, могу ли я продемонстрировать неатомарность чтения и записи для типа, для которого атомарность таких операций не гарантируется.
private static double _d;
[STAThread]
static void Main()
{
new Thread(KeepMutating).Start();
KeepReading();
}
private static void KeepReading()
{
while (true)
{
double dCopy = _d;
// In release: if (...) throw ...
Debug.Assert(dCopy == 0D || dCopy == double.MaxValue); // Never fails
}
}
private static void KeepMutating()
{
Random rand = new Random();
while (true)
{
_d = rand.Next(2) == 0 ? 0D : double.MaxValue;
}
}
To к моему удивлению, утверждение отказалось потерпеть неудачу даже после целых трех минут исполнения. Что дает?
Конечно, я не знаю ' Я намерен полагаться на любое поведение, которое явно не гарантируется спецификацией, но мне хотелось бы более глубокого понимания проблемы.
К вашему сведению, я запускал это как в Debug, так и в Release (изменяя Debug.Assert
] в if (..) throw
) профили в двух разных средах:
ИЗМЕНИТЬ :
Основано на предложении Дэна Брайанта: использование long
вместо double
практически мгновенно разрывает его.