2016-01-12 22 views
6

Sto studiando il kernel Linux con Linux Kernel Development di Robert Love.atomic_t in Linux

Come sapete, questo libro utilizza la vecchia versione di Linux. È nella versione 2.6

atomic_t ha "contatore volatile int". Ma atomic_t della nuova versione Linux ha "int counter" non volatile. Perché questo volatile è cancellato?

+0

Forse perché non è sufficiente in un sistema multi-CPU? O forse perché l'API è cambiata? Ottieni una risorsa più recente, il kernel di Linux non ha un'API interna fissa. – Olaf

+0

Vedere anche [Perché è necessaria la volatile in C?] (Https://stackoverflow.com/questions/246127/why-is-volatile-needed-in-c) e correlati. – edmz

risposta

5

Poiché le variabili volatili non sono variabili atomiche. L'unico punto nell'utilizzo di volatile consiste nel prevenire possibili ottimizzazioni del compilatore, il che non equivale a impedire accessi concorrenti indesiderati.

A tale proposito, l'uso di volatile non è quasi mai corretto.

Ulteriori informazioni a riguardo sono disponibili in Semantics and Behavior of Atomic and Bitmask Operations.

Citando una piccola parte di esso:

* ATTENZIONE: atomic_read() e atomic_set() non implicano BARRIERE! *

Alcune architetture possono scegliere di utilizzare la parola chiave volatile, le barriere, o inline assemblaggio di garantire un certo grado di immediatezza per atomic_read() e atomic_set(). Questo non è garantito in modo uniforme, e potrebbe cambiare in futuro, in modo che tutti gli utenti di atomic_t debbano trattare atomic_read() e atomic_set() come semplici istruzioni C che possono essere riordinate o ottimizzate completamente dal compilatore o dal processore, ed esplicitamente richiama il compilatore e/o la memoria appropriata barriera per ogni caso d'uso. In caso contrario si verificherà un codice che potrebbe interrompersi improvvisamente quando utilizzato con architetture o compilatori diversi, , o anche modifiche nel codice non correlato che modifica il modo in cui il compilatore ottimizza la sezione che accede alle variabili atomic_t.

* SEI STATO AVVISATO! *

+0

Grazie. Ma poi, voglio sapere perché il kernel usa struct per la variabile int. Voglio dire, perché non usare solo "atomic_t counter;" (se int è un tipo definito come atomic_t) piuttosto una struttura atomic_t che ha solo un varaible: "contatore int"? –

+1

Secondo il documento che ho indicato, la ragione per cui avvolgono la variabile in una struttura e la definiamo come un tipo è di impedire qualsiasi tipo di cast a un normale tipo C intero. – jweyrich