2016-01-12 10 views
6

Ich studiere Linux-Kernel mit Linux-Kernel-Entwicklung von Robert Love.atomic_t in Linux

Wie Sie wissen, verwendet dieses Buch die alte Version von Linux. Es ist in Version 2.6

atomic_t hat "volatile int counter". Aber die atomic_t der neuen Linux-Version hat "int counter" nicht flüchtig. Warum hat dieses volatile gelöscht?

+0

Vielleicht weil es in einem Multi-CPU-System nicht ausreicht? Oder vielleicht, weil sich die API geändert hat? Holen Sie sich eine neuere Ressource, der Linux-Kernel hat keine feste interne API. – Olaf

+0

Siehe auch [Warum flüchtige in C benötigt wird?] (Https://stackoverflow.com/questions/246127/why-is-volatile-needed-in-c) und verwandte. – edmz

Antwort

5

Da volatile Variablen keine atomaren Variablen sind. Der einzige Punkt bei der Verwendung von volatile besteht darin, mögliche Compileroptimierungen zu verhindern, was nicht dasselbe ist wie das Verhindern unerwünschter gleichzeitiger Zugriffe.

In dieser Hinsicht ist die Verwendung von volatile fast nie korrekt. Sie können mehr darüber in Semantics and Behavior of Atomic and Bitmask Operations lesen.

einen kleinen Teil davon Zitiert:

* WARNUNG: atomic_read() und atomic_set() NICHT SPERREN BEDEUTET! *

Einige Architekturen des flüchtigen Stichwort, Barrieren zu verwenden, oder Inline- Montage eine gewisse Unmittelbarkeit für atomic_read zu gewährleisten() und atomic_set() kann wählen. Dies ist nicht einheitlich garantiert und kann in Zukunft geändert werden, , so dass alle Benutzer von atomic_t atomic_read() und atomic_set() als einfache C-Anweisungen behandeln sollten, die vom Compiler oder dem Prozessor und explizit explizit neu geordnet oder optimiert werden können Rufen Sie den entsprechenden Compiler und/oder Speicher Barriere für jeden Anwendungsfall auf. Wenn Sie dies nicht tun, wird Code plötzlich brechen, wenn mit verschiedenen Architekturen oder Compiler Optimierungen oder sogar Änderungen in nicht verwandten Code, der den Compiler optimiert den Abschnitt Zugriff auf atomic_t Variablen verändert verwendet.

* SIE SIND GEWARNT! *

+0

Danke. Aber dann möchte ich wissen, warum Kernel struct für int-Variable verwenden. Ich meine, warum nicht nur "atomic_t counter;" (wenn int ist Typ als atomic_t definiert) eher atomic_t Struktur, die nur eine Variable hat: "int counter"? –

+1

Laut dem Dokument, auf das ich hingewiesen habe, ist der Grund dafür, dass sie die Variable in eine Struktur umbrechen und sie als Typ definieren, darin zu bestehen, jede Art von Umwandlung in einen normalen C-Integer-Typ zu verhindern. – jweyrich