Должен ли я получить блокировку для записи в ЛЮБУЮ общую память?

Я пишу многопоточный код C и только что наткнулся на этот вопрос StackOverflow. Похоже, что компилятор позаботится о том, чтобы ввод-вывод в разные части структуры никогда не пересекался и не вызывал какого-либо состояния гонки.

Мой вопрос в качестве расширения заключается в том, существуют ли аналогичные гарантии для двух разных структур, которые пространственно близки в общей памяти?

Изменить: пространственно близко, как на «той же странице». Могут ли две записи из двух разных потоков на одну и ту же страницу вызвать состояние гонки? Один парень может в конечном итоге сбросить устаревшую страницу из своего кеша в память (возможно ли это?).

Скажем, у меня есть два бита в виде собственных структур в общей памяти. Если они окажутся смежными, может ли один поток, записывающий в один из них, перезаписать другой? Должен ли я сериализовать все потоки с одной блокировкой для доступа к любой из этих структур в общей памяти?

Или все это и проблема в указанном вопросе в любом случае представляют риск для C99?


person WestaAlger    schedule 07.06.2019    source источник
comment
Да. Если вы записываете соседние биты в одном блоке, это гонка. Запись будет выполняться путем маскирования окружающих символов char/short/int/long — вы, по сути, будете гоняться за одним и тем же местом в памяти.   -  person PSkocik    schedule 07.06.2019
comment
Если они окажутся смежными — это кажется ложной предпосылкой, учитывая предположение, что оба бита являются частью разных структур.   -  person harold    schedule 07.06.2019
comment
@harold Звучит правильно. Я совершенно забыл о выравнивании структур в C. Поэтому чтение/запись не должны пересекаться между разными структурами. Будет ли иметь значение, если структуры окажутся на одной странице? Отредактированный вопрос для уточнения.   -  person WestaAlger    schedule 07.06.2019
comment
Нет такой вещи, как сброс страницы в оперативную память.   -  person curiousguy    schedule 08.06.2019