TL; DR: Ожидаете ли вы, что atomic_ref<3 bytes struct>
будет без блокировок, или достичь отсутствия блокировки с помощью CAS или LL / S C на большем объеме памяти, если это возможно?
Это продолжение atomic_ref, когда внешний базовый тип не выровнен в соответствии с запросом вопрос.
Вероятно, слишком большой для комментария и недостаточно связанный для редактирования исходного вопроса.
Думаю, что возможно реализовать lock-free atomic_ref<T>
для неестественного размера c atomi. Это не степень двойки.
Такой atomic_ref<T>
может обращаться к выровненной памяти как к более широкому типу. В большинстве случаев для сравнения биржи приходилось откатываться назад. Все равно это будет atomi c.
Это будет соответствовать случаям T, когда реализация atomic<T>
добавит переданный тип к ближайшему atomi c size.
Я думаю, что P0091 явно позволяет пропустить это и сделать atomic_ref<T>
только для естественных atomi c размеров:
Примечание: Независимо от того, является ли реализация atomi c свободной от блокировки, не обязательно ограничить, является ли соответствующая реализация atomic_ref свободной от блокировки. - конечное примечание
Но что ожидается?
(Я понимаю, что сравнение-обмен не так эффективен, как обычный магазин или обмен, но все же я предполагаю он может быть более эффективным, чем на основе блокировки, и с такой реализацией atomic_ref
загрузка может быть даже реализована как обычная загрузка)
Пример:
struct S { char a, b, c; };
std::cout << std::boolalpha << std::atomic<S>::is_always_lock_free << '\n'; // I expect true
std::cout << std::boolalpha << std::atomic_ref<S>::is_always_lock_free << '\n'; // What should I expect?