Как специализированный атомарный тип может быть свободным от блокировки?

Я нашел следующий код, выход всегда:

std::atomic<A> is lock free? false
std::atomic<B> is lock free? true

Это код:

struct A { int a[100]; };
struct B { int x, y; };
int main()
{
    std::cout << std::boolalpha
              << "std::atomic<A> is lock free? "
              << std::atomic<A>{}.is_lock_free() << '\n'
              << "std::atomic<B> is lock free? "
              << std::atomic<B>{}.is_lock_free() << '\n';
}

Я не понимаю, как второй структурный атомарный тип может быть свободным от блокировки, а первый специализированный атомарный тип не может быть свободным от блокировки?

Заранее спасибо.

2 ответа

Решение

http://en.cppreference.com/w/cpp/atomic/atomic_is_lock_free действительно объясняет это в разделе комментариев. Выравнивание памяти и размер регистра могут позволить обрабатывать 2 упакованных целых числа атомарным способом. Другими словами, 2 выровненных целых числа не отличаются от одного длинного длинного в 64-битной системе с 128-битным регистром.

std::atomic требует, чтобы его аргумент шаблона был тривиально копируемым. То есть он знает, что (загрузка, сохранение и т. Д.) Операции над вашей структурой B просто скопируйте байты, и это можно сделать с помощью соответствующих атомарных инструкций, если они достаточно широки.

Другие вопросы по тегам