C++, вопрос про атомарность

114
03 октября 2021, 12:20

Я не могу найти ответы на следующие вопросы:

  1. Существует мнение, что если атомарные объекты имеют неверное выравнивание, то такие объекты теряют свою атомарность. Объяснений, почему это происходит, я не нашел. И даже не нашел объяснений, всегда ли это происходит, или только в том случае, если атомарный объект оказывается на границе двух кешлиний.

  2. Существует мнение, что несинхронизованное изменение неатомарной переменной из разных потоков может приводить не только к нарушению порядка изменения этой переменной, но и к тому, что в переменной окажется сломанное значение. Например, один поток запишет одну половину значения, а другой - другую. Это объяснение кажется правдоподобным, но лишь в отрыве от специфики синхронизации данных между ядрами/процессорами. Насколько мне известно, обычно мельчайшей единицей синхронизации между ядрами/процессорами является кэшлиния, размер которой, как правило, составляет 64 байта. Поэтому, мне не ясно, как многобайтовая переменная может сломаться, если она целиком попадает в одну кэшлинию.

Я буду очень благодарен за любую информацию по этим двум вопросам. Заранее, спасибо.

Answer 1

В С++ есть стандарт, и там написано что

1) все объекты должны быть выравнены, иначе поведение не определено
2) при гонках поведение не определено

Если вы используете невыравненные переменные, или если у вас гонки, читайте документацию процессора.

Например, в доках Интела, том 3A, глава 8.1.1 Guaranteed Atomic Operations:

The P6 family processors (and newer processors since) guarantee that the following additional memory operation will always be carried out atomically:
• Unaligned 16-, 32-, and 64-bit accesses to cached memory that fit within a cache line.

У других процессоров может быть другое поведение. Также оптимизатор С++ опирается на стандарт, а не на архитектуру процессора, и может выкинуть ваш нестандартный код.

READ ALSO
Соединение сигналами и слотами класса приложения и класса из dll подгружаемой динамически

Соединение сигналами и слотами класса приложения и класса из dll подгружаемой динамически

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

87
postgresql для разработчика С++

postgresql для разработчика С++

Всем приветПожалуйста, помогите разобраться в ситуации

83
Проблема с вводом-выводом бинарных файлов

Проблема с вводом-выводом бинарных файлов

Проблема возникает на этапе чтения из файла, так как я открыл файл hex редактором, и в нем число естьЧто я делаю не так?

82
Как можно сократить время компиляции в c++

Как можно сократить время компиляции в c++

Я написал программу и начал проверять ееУ нее стоит условие, что время выполнения меньше 1 секунды

91