2016-01-19 11 views
5

C11 Standard besagt, dass für die Atomtypen (_Atomic), Präfix und Postfix ++ und -- Operationen are atomic, ebenso wie Verbindung Zuordnungen (6.5.2.4, P2.): op= (6.5.16.2, p3) .Atomicity des einfachen Zuweisungsoperators

Ich habe nichts über eine einfache Aufgabe = geschrieben geschrieben. Ist es auch Atom?

Sagen wir, E1, E2 sind int, aber nur E1 ist mit dem Spezifizierer _Atomic definiert. Meine Vermutung ist, dass dies:

E1 = E2; 

entspricht:

atomic_store(&E1 , E2); 

Es ist meine Vermutung richtig?

+2

Wie kann das _not_ atomar sein. Welcher Zustand ist zwischen 'gesetzt' und 'nicht festgelegt'? –

+3

@WernerVanBelle Dies ist aus der Sicht des Standards. Stellen Sie sich eine abstrakte Maschine vor. – 2501

+5

@WernerVanBelle Bei Atmel mit avr-gcc, zum Beispiel, wenn Sie eine 16-Bit-Variable setzen, wird zuerst das High-Byte und dann das Low-Byte gesetzt. – Ctx

Antwort

3

Nach dem Beispiel in dieser Dr Dobbs article, einfache Zuordnung von atomaren Variablen in C11 ist atomar.

Der C11-Standard (ISO/IEC 9899: 2011), Abschnitt 6.2.6.1/9 lautet:

Lasten und speichert von Objekten mit Atom-Typen sind mit memory_order_seq_cst Semantik getan.

Zusätzlich atomar sind, durchgeführten Operationen mit memory_order_seq_cst Semantik eine einzige Anordnung von allen Threads beobachtet haben (aka sequentially-consistent ordering).

Ohne den Typqualifikator _Atomic ist es möglich, dass eine Zuweisung nicht atomar ist. Das Zuweisen eines 64-Bit-Werts (z. B. long long) auf einer 32-Bit-Maschine erfordert zwei CPU-Zyklen. Wenn ein anderer Thread den Wert zwischen diesen beiden Zyklen liest, erhalten sie 4 Bytes des alten Wertes und 4 Bytes des neuen Wertes.