Обеспечение того, что записи видны из разных потоков чтения - PullRequest
2 голосов
/ 18 марта 2019

Дан следующий класс:

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 решит эту проблему, но есть ли что-нибудь еще, что решило бы эту проблему?

1 Ответ

0 голосов
/ 18 марта 2019

Используйте оператор lock, чтобы другие потоки ожидали его разблокировки.

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/lock-statement

...