У меня есть один писатель, который должен увеличивать переменную с довольно высокой частотой, а также один или несколько читателей, которые обращаются к этой переменной с более низкой частотой.
Запись инициируется внешним прерыванием.
Поскольку мне нужно писать с высокой скоростью, я не хочу использовать мьютексы или другие дорогие механизмы блокировки.
Подход, который я придумал, копировал значение после записи в него. Читатель теперь может сравнить оригинал с копией. Если они равны, содержимое переменной допустимо.
Вот моя реализация на C ++
template<typename T>
class SafeValue
{
private:
volatile T _value;
volatile T _valueCheck;
public:
void setValue(T newValue)
{
_value = newValue;
_valueCheck = _value;
}
T getValue()
{
volatile T value;
volatile T valueCheck;
do
{
valueCheck = _valueCheck;
value = _value;
} while(value != valueCheck);
return value;
}
}
Идея, стоящая за этим, заключается в обнаружении гонок данных во время чтения и повторной попытки, если они произойдут. Тем не менее, я не знаю, будет ли это всегда работать. Я не нашел ничего об этом доступе онлайн, поэтому мой вопрос:
Есть ли проблемы с моим подходом при использовании с одним писателем и несколькими читателями?
Я уже знаю, что высокая частота записи может вызвать голод у читателя. Есть ли еще плохие последствия, о которых я должен быть осторожен? Может ли быть так, что это вообще не потокобезопасно?
Редактировать 1:
Моя целевая система - ARM Cortex-A15.
T
должен иметь возможность стать хотя бы любым примитивным целочисленным типом.
Редактировать 2:
std::atomic
слишком медленно на сайте чтения и записи. Я проверил это в моей системе. Запись происходит примерно в 30 раз медленнее, чтение примерно в 50 раз по сравнению с незащищенными примитивными операциями.