Является ли Unsynchronized записывает в глобальные переменные UB, если код не читается из них?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Является ли Unsynchronized записывает в глобальные переменные UB, если код не читается из них?

Сообщение Anonymous »

Для целей отладки наш проект иногда использует глобальные летучие переменные: < /p>

Код: Выделить всё

volatile struct {
uintptr_t last_read = 0;
uintptr_t last_write = 0;
size_t reads = 0;
size_t writes = 0;
} dbg_data = {};

uint64_t register_read(uintptr_t address) {
dbg_data.last_read = address;
dbg_data.reads++;
return *static_cast(address);
}

void register_write(uintptr_t address, uint64_t value) {
dbg_data.last_write = address;
dbg_data.writes++;
*static_cast(address) = value;
}
< /code>
Они никогда не читаются из кода, только отладчиком, чтобы быстро увидеть состояние программы. Несмотря на то, что программа многопоточная, было решено не синхронизировать доступ к этим глобальным переменным, чтобы избежать достижения производительности. Даже атомика нежелательна, поскольку они постоянно вызывают недействительную кеша. В худшем случае условие гонки приведет к пропущению некоторых значений, что приемлемо. Волшебное мышление о летучих 
обычно следуют. Можно ли решить его в лучшем виде, не делая каждого поля атомного и не блокируя все с помощью мутекса?


Подробнее здесь: https://stackoverflow.com/questions/796 ... -from-them
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»