У нас есть старый код, который мы обновляем, чтобы использовать более современный c ++.Ранее он использовал (yucky) расширение визуальной студии для volatile
для атомарного доступа к переменной.
Эта функция похожа на
T ReadAq(T* val)
{
return *(volatile T*)val;
}
Обратите внимание, что T
выровнен соответствующим образоми достаточно мал, чтобы архитектуры, которые мы поддерживаем, могли быть в состоянии выполнить одно чтение без копирования.
Для записи в переменную предусмотрена аналогичная функциональность, и все ее применения выполняются через одну из этих функций.
И я действительно не хочу менять свою подпись (так как это было бы огромным изменением для всех вызывающих абонентов), поэтому я хочу иметь возможность сделать что-то вроде:
T ReadAq(T* val)
{
return std::atomic_read(val, std::memory_order_acquire);
}
Но это похоже на функциональностькак это не существует в стандарте - все атомарные операции выполняются на типах std :: atomic.Любые идеи о том, можно ли это исправить без изменения подписи ReadAq
?