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