Re[3]: Memory barrier не могу понять что это
От: vsb Казахстан  
Дата: 05.04.23 13:19
Оценка: 6 (1)
Здравствуйте, 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 алгоритмы используют подобный подход.
Отредактировано 05.04.2023 13:22 vsb . Предыдущая версия . Еще …
Отредактировано 05.04.2023 13:21 vsb . Предыдущая версия .
Отредактировано 05.04.2023 13:21 vsb . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.