Сообщение Re[3]: Memory barrier не могу понять что это от 05.04.2023 13:19
Изменено 05.04.2023 13:21 vsb
Re[3]: Memory barrier не могу понять что это
Здравствуйте, paradok, Вы писали:
>>>Когда несколько процессоров работают с одним адресом памяти
P>это надо специально запрграммировать... сама по себе такая ситуация не может возникнуть... или давайте пример кода!
Вот пример кода. Без барьеров памяти на некоторых архитектурах (вроде ARM) функция impossible может быть вызвана, хотя это противоречит интуиции.
P>если же вы сами запрограммировали создание шаред мемори и сами ее меняете из разных процессов то и сами должны позаботиться о синхронизации и никакие барьеры вам не нужны
Общая память чаще встречается при многопоточном программировании. Внутри одной программы все потоки имеют доступ к общей памяти процесса.
Если использовать синхронизацию, дополнительно никакие барьеры действительно не нужны. Барьеры нужны, когда кажется, что использовать синхронизацию — слишком дорого и хочется ускорить подобный код. Т.н. lock-free алгоритмы используют подобный подход.
>>>Когда несколько процессоров работают с одним адресом памяти
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>это надо специально запрграммировать... сама по себе такая ситуация не может возникнуть... или давайте пример кода!
Вот пример кода. Без барьеров памяти на некоторых архитектурах (вроде ARM) функция impossible может быть вызвана, хотя это противоречит интуиции. Могут быть и более тонкие баги, к примеру конструктор вызывается в одном потоке, сконструированный объект передаётся в другой поток, но другой поток видит не до конца сконструированный объект. В Java в конструкторы специально вставляются нужные барьеры, чтобы такой ситуации не возникло, про C# не знаю. В С++ такое точно возможно.
P>если же вы сами запрограммировали создание шаред мемори и сами ее меняете из разных процессов то и сами должны позаботиться о синхронизации и никакие барьеры вам не нужны
Общая память чаще встречается при многопоточном программировании. Внутри одной программы все потоки имеют доступ к общей памяти процесса.
Если использовать синхронизацию, дополнительно никакие барьеры действительно не нужны. Барьеры нужны, когда кажется, что использовать синхронизацию — слишком дорого и хочется ускорить подобный код. Т.н. lock-free алгоритмы используют подобный подход.
>>>Когда несколько процессоров работают с одним адресом памяти
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 алгоритмы используют подобный подход.