Я хотел бы атомарно поменять слово состояния, используя обычный шаблон CAS:
extern int status;
int change_state(void)
{
while (true)
{
int old = atomic_load(&status);
int new = prepare_new_status();
if (atomic_compare_exchange_strong(&status, &old, new))
return old;
}
}
Но так как old
может быть не выровнен или может быть переменной регистра, является ли &old
переносимым?
Если нет, как правильно атомарно обновить слово состояния в архитектурах, где int
доступ должен быть выровнен по слову?