запись одновременно в один байт памяти - PullRequest
0 голосов
/ 01 мая 2020

У нас есть класс в 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 так же быстро, как и обычное чтение, и избегает других оптимизаций компилятора, которые могут вызвать странные проблемы при записи / чтении переменной одновременно без синхронизации?

1 Ответ

0 голосов
/ 01 мая 2020

Если вы написали поточно-ориентированное приложение с надлежащими блокировками при выполнении записи, это не вызовет никаких проблем.

Предполагая, что вы имеете в виду безопасное приложение без потоков, возникнет ли проблема? Могут быть, но не будут повреждены любые другие поля.

...