Helpers - компьютеры, интернет, программирование

Непонимание цели барьеров памяти в C #

Прежде чем я начну, я просто хочу подтвердить, что я знаю, что есть вопросы по этому поводу, которые я связал ниже:

Зачем мне нужен барьер памяти?

Зачем нам нужен Thread.MemoryBarrier ()?

Тем не менее ... Я прочитал оба и до сих пор не совсем понимаю, что происходит на базовом уровне.

class Foo
{
  int _answer;
  bool _complete;

  void A()
  {
    _answer = 123;
    Thread.MemoryBarrier();    // Barrier 1
    _complete = true;
    Thread.MemoryBarrier();    // Barrier 2
  }

  void B()
  {
    Thread.MemoryBarrier();    // Barrier 3
    if (_complete)
    {
      Thread.MemoryBarrier();       // Barrier 4
      Console.WriteLine (_answer);
    }
  }
}

Этот фрагмент кода взят из C # 4.0 в двух словах. В настоящее время я понимаю, что проблема без барьеров памяти заключается в том, что существует вероятность того, что B запустится до того, как A и B ничего не напечатают, потому что _complete можно оценить как false.

«Барьеры» в каждой функции полностью отделены друг от друга, и это не похоже на то, чтобы барьеры упорядочены ... Thread.MemoryBarrier(1) или что-то в этом роде, поэтому компилятор не знает, что A должно стоять перед B < / сильный>.

Может ли кто-нибудь прояснить это для меня? Спасибо

РЕДАКТИРОВАТЬ: Я не понимаю, как работает порядок инструкций ... но я настолько сбит с толку в этой теме, что даже не знаю, как правильно сформулировать свой вопрос.

17.01.2016

Ответы:


1

В настоящее время я понимаю, что проблема без барьеров памяти заключается в том, что существует вероятность того, что B запустится до того, как A и B ничего не напечатают, потому что _complete может быть оценен как false.

Нет, проблема в компиляторе, джиттере или переупорядочении инструкций ЦП. Возможен случай, когда некоторые из них могут переупорядочить

_answer = 123;
_complete = true;

инструкции для некоторой оптимизации, поскольку форма точки зрения однопоточного приложения не имеет значения, их порядок.

Теперь предположим, что они переупорядочены как

_complete = true;
_answer = 123;

в настоящее время:

  • Набор ниток 1 _complete = true
  • Thread 2 get _complete
    • evaluate if condition
    • получить _answer (который равен 0)
    • Console.WriteLine (_answer) -> 0
  • Резьба 1 комплект _answer = 123

Нарушена логика кода.

17.01.2016
  • МОЙ БОГ! Теперь я полностью понимаю, не могу поверить, что это было так просто. Я был совершенно не в себе. У меня есть еще 1 вопрос, если вы не против. 17.01.2016
  • Какая часть кода - Thread.MemoryBarrier (); контроль? Например .... первый вызов Thread.MemoryBarrier () ... Какой фрагмент кода останавливается от реорганизации? 17.01.2016
  • Первый барьер памяти устанавливает полное ограждение и запрещает перемещение _answer = 123; рядом с _complete = true; и наоборот, а второй барьер освобождает линию денежных средств ЦП и гарантирует, что _answer и _complete свежие. 17.01.2016
  • Новые материалы

    Интуитивное понимание тензоров в машинном обучении
    Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

    Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
    Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

    Почему объяснимость так важна прямо сейчас?
    По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

    Анимированный математический анализ
    Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

    Создание простого слайдера изображений с помощью JavaScript
    Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

    Создание базы данных с помощью супергероя «Python»
    В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

    ИИ для чайников: руководство для начинающих по пониманию будущего технологий
    Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..


    © 2024 hlprs.ru, Helpers - компьютеры, интернет, программирование