Дан следующий класс:
class C
{
public int x = 0;
public void F() {
new Thread(G).Start();
while (x == 0) { Thread.Sleep(TimeSpan.FromMilliseconds(1)); }
}
public void G() {
Thread.Sleep(TimeSpan.FromMilliseconds(1000));
Interlocked.Exchange(ref x, 1);
}
}
Я предполагаю, что согласно стандарту C#
разрешено new C().F()
работать вечно да, потому что нет ничего, что заставляло бы F()
извлекать значение x
из основной памяти при каждом доступе. Interlocked.Exchange
здесь даже не помогает, поскольку F()
не видит реализацию G()
, поэтому может оптимизировать доступ из основной памяти.
Является ли этот анализ правильным?
Кроме того, я понимаю, что x
volatile решит эту проблему, но есть ли что-нибудь еще, что решило бы эту проблему?