Как может структура специализированного атомарного типа быть свободной от блокировки?
Я нашел следующий код, выход всегда:
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';
}
Я не понимаю, как может вторая структура специализированного атомарного типа быть свободной от блокировки, а 1-й Специализированный атомарный тип не может быть свободным от блокировки?
Заранее благодарю.
2 ответа:
Http://en.cppreference.com/w/cpp/atomic/atomic_is_lock_free действительно объясняет это в разделе комментариев. Выравнивание памяти и размер регистра могут позволить 2 упакованным ints быть обработаны атомарным способом. Другими словами, 2 выровненных int не отличаются от одного long long в 64-битной системе со 128-битным регистром.