Мне нужно обеспечить синхронизацию для некоторых элементов структуры.
Если структура выглядит примерно так
struct SharedStruct {
int Value1;
int Value2;
}
и у меня есть глобальная переменная
SharedStruct obj;
Я хочу, чтобы запись с процессора
obj.Value1 = 5; // Processor B
быть немедленно видимым для других процессоров, так что, когда я проверяю значение
if(obj.Value1 == 5) { DoSmth(); } // Processor A
else DoSmthElse();
чтобы получить новое значение, а не какое-то старое значение из кеша.
Сначала я подумал, что если я использую volatile при записи/чтении значений, этого достаточно. Но я читал, что volatile не может решить такие проблемы.
Члены гарантированно правильно выровнены по границам 2/4/8 байт, и записи в этом случае должны быть атомарными, но я не уверен, как это сделать. кеш может этому помешать.
Будет достаточно использовать барьеры памяти (mfence, sfence и т.д.)? Или требуются какие-то взаимосвязанные операции?
Или, может быть, что-то вроде
lock mov addr, REGISTER
?
Очевидно, проще всего было бы использовать какой-нибудь запирающий механизм, но скорость имеет решающее значение, а замки не по карману :(
Изменить
Возможно, мне следует немного пояснить. Значение устанавливается только один раз (ведет себя как флаг). Всем остальным веткам нужно просто прочитать это. Вот почему я думаю, что это может быть способ принудительно прочитать это новое значение без использования блокировок.
Заранее спасибо!