Информация об изменениях

Сообщение Re[3]: Memory barrier не могу понять что это от 05.04.2023 13:19

Изменено 05.04.2023 13:21 vsb

Re[3]: Memory barrier не могу понять что это
Здравствуйте, paradok, Вы писали:

>>>Когда несколько процессоров работают с одним адресом памяти

P>это надо специально запрграммировать... сама по себе такая ситуация не может возникнуть... или давайте пример кода!

class Ab {
  public int a;
  public int b;
}

void thread1(Ab ab) {
  ab.a = 5;
  ab.b = 10;
}

void thread2(Ab ab) {
  if (ab.a != 5 && ab.b == 10) {
    impossible();
  }
}


Вот пример кода. Без барьеров памяти на некоторых архитектурах (вроде ARM) функция impossible может быть вызвана, хотя это противоречит интуиции.

P>если же вы сами запрограммировали создание шаред мемори и сами ее меняете из разных процессов то и сами должны позаботиться о синхронизации и никакие барьеры вам не нужны


Общая память чаще встречается при многопоточном программировании. Внутри одной программы все потоки имеют доступ к общей памяти процесса.

Если использовать синхронизацию, дополнительно никакие барьеры действительно не нужны. Барьеры нужны, когда кажется, что использовать синхронизацию — слишком дорого и хочется ускорить подобный код. Т.н. lock-free алгоритмы используют подобный подход.
Re[3]: Memory barrier не могу понять что это
Здравствуйте, paradok, Вы писали:

>>>Когда несколько процессоров работают с одним адресом памяти

P>это надо специально запрграммировать... сама по себе такая ситуация не может возникнуть... или давайте пример кода!

class Ab {
  public int a;
  public int b;
}

void thread1(Ab ab) {
  ab.a = 5;
  ab.b = 10;
}

void thread2(Ab ab) {
  if (ab.a != 5 && ab.b == 10) {
    impossible();
  }
}


Вот пример кода. Без барьеров памяти на некоторых архитектурах (вроде ARM) функция impossible может быть вызвана, хотя это противоречит интуиции. Могут быть и более тонкие баги, к примеру конструктор вызывается в одном потоке, сконструированный объект передаётся в другой поток, но другой поток видит не до конца сконструированный объект. В Java в конструкторы специально вставляются нужные барьеры, чтобы такой ситуации не возникло, про C# не знаю. В С++ такое точно возможно.

P>если же вы сами запрограммировали создание шаред мемори и сами ее меняете из разных процессов то и сами должны позаботиться о синхронизации и никакие барьеры вам не нужны


Общая память чаще встречается при многопоточном программировании. Внутри одной программы все потоки имеют доступ к общей памяти процесса.

Если использовать синхронизацию, дополнительно никакие барьеры действительно не нужны. Барьеры нужны, когда кажется, что использовать синхронизацию — слишком дорого и хочется ускорить подобный код. Т.н. lock-free алгоритмы используют подобный подход.