У нас есть класс в c ++, который имеет unsigned char
флаг поля.
class XYZ
{
... some fields..
unsigned char someFlag;
... some more fields
};
Для того же объекта XYZ
мы пишем 0
и 1
логическое значение для someFlag
из нескольких потоков и чтения из всех потоков без каких-либо примитивов синхронизации, таких как блокировки или атомы c. В идеале это переключалось бы между 0 и 1. someFlag
изменяется при каждом запросе, и даже если мы видим, что оно временно включено / отключено для нескольких запросов, это нормально.
Возможно ли, что это может привести к повреждению полей в следующем someFlag
?
Если да, то что, если мы добавим someFlag
4 байта до и после?
Я думаю об использовании std::atomic<bool>
или аналогичного типа данных ... но я нужно убедить автора библиотеки использовать ее, предоставив пример возможных гонок данных.
Читает из std::atomic
с relaxed
так же быстро, как и обычное чтение, и избегает других оптимизаций компилятора, которые могут вызвать странные проблемы при записи / чтении переменной одновременно без синхронизации?