atomic_ref, когда размер внешнего базового типа не является степенью двойки - PullRequest
2 голосов
/ 25 мая 2020

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?
...