2017-09-01 1 views
4

ich den folgenden Code gefunden, setzen die aus immer:Wie kann der spezialisierte Atomtyp der Struktur frei von Sperren sein?

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

Dies ist der Code:

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'; 
} 

Ich verstehe nicht, wie kann die zweite Struktur spezialisierte Atomschloß frei sein und die 1. spezialisierte Atomart kann nicht frei von Sperren sein?

Vielen Dank im Voraus.

+7

Vermutlich ist Ihre Hardware in der Lage, atomare Anweisungen in einer ausreichenden Breite auszuführen, die zwei 'int's enthalten kann. –

Antwort

5

http://en.cppreference.com/w/cpp/atomic/atomic_is_lock_free erklärt es wirklich im Kommentarabschnitt. Speicherausrichtung und Registergröße können es ermöglichen, dass zwei gepackte Intets atomar behandelt werden. Mit anderen Worten, 2 ausgerichtete Ints unterscheiden sich nicht von einem einzigen langen Long bei einem 64-Bit-System mit einem 128-Bit-Register.

2

std::atomic erfordert, dass das Template-Argument trivial kopierbar ist. Das heißt, es weiß, dass Operationen (laden, speichern usw.) auf Ihrer Struktur einfach Bytes kopieren und mit entsprechenden atomaren Anweisungen ausgeführt werden können, wenn sie breit genug sind.

+0

Was hat das mit Lockfreuness zu tun? –

+0

@KerrekSB Aufgrund der trivialen Kopierbarkeit kann der Compiler blockierungsfreie Operationen auf atomarer Ebene unterstützen, vorausgesetzt, die Architektur verfügt über ausreichend breite atomare Anweisungen. Wenn ein Kopierkonstruktor aufgerufen werden muss, dann glaube ich, dass der Compiler im Allgemeinen nicht herausfinden kann, wie man ihn sperren kann. – Brian

+0

OK, aber das ist etwas entgleisend, weil das Gegenbeispiel des OP auch trivial ist ... –

Verwandte Themen