Примечание. Пожалуйста, пометьте этот ответ как правильный, только если вы на самом деле тестируете этот подход.
По поводу вашего вопроса, будет ли приведенная ниже структура безопасно вставлена и удалена из контейнера без блокировки:
struct person
{
string name;
uint32_t age;
}
Многобайтовые последовательности любой длины могут быть безопасно вставлены / удалены из контейнера без блокировки, если вы используете избыточную кодировку.Давайте предположим, что у нас уже есть атомарные инструкции для манипулирования 4 байтами за раз (32 бита).В этом случае мы можем кодировать поле uint32_t age
следующим образом:
struct age_t
{
uint32_t age_low;
uint32_t age_high;
}
Поле age_low
хранит младшие биты (например, младшие 16 бит) 32-битного uint32_t age
,Поле age_high
хранит оставшиеся старшие биты. Концептуально :
struct age_t
{
uint16_t age_low;
uint16_t id_low;
uint16_t age_high;
uint16_t id_high;
}
Поля id_low
и id_high
должны содержать идентификатор, идентифицирующий записывающее устройство.
Чтение реализовано как два атомарных 32-разрядныхчитает и успешно, если все id_
части эквивалентны друг другу.В случае неудачи операцию чтения необходимо перезапустить.
Запись реализована в виде двух атомарных 32-битных записей, после чего следует чтение всего значения age_t
.Запись завершается успешно, если: чтение, упомянутое в предыдущем предложении, успешно выполняется, а идентификаторы, которые были прочитаны, эквивалентны записанным идентификаторам.
О значении string
: принцип тот же.Вам просто нужно выяснить, как разделить его двоичное значение аналогично тому, как было разделено значение age
.То же самое относится к чтению / записи всей структуры person
.