Здравствуйте, 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 алгоритмы используют подобный подход.