Предположим, у меня есть приложение на C ++ 11, в котором два потока пишут другой, но рядом места в памяти, используя простые указатели на примитивные типы. Могу ли я быть уверен, что обе эти записи в конечном итоге окажутся в памяти (возможно, после того, как обе boost::barrier
), или есть риск, что оба ядра ЦП будут иметь свою собственную строку кэша, содержащую эти данные, и второе ядро, сбрасывающее свою модификацию в ОЗУ, перезапишет и отменит модификацию, выполненную при первой записи?
Я надеюсь, что согласованность кэша позаботится об этом для меня во всех ситуациях и на всех установках, совместимых с моделью памяти C ++ 11, но я хотел бы быть уверен.
Да, механизмы когерентности кэша позаботятся об этом. Это называется Ложный обмен и следует избегать лучшего разделения данных для повышения производительности.
Других решений пока нет …