Lire et écrire l'implémentation de l'opération atomique dans le noyau Linux

Récemment, j'ai jeté un coup d'oeil dans le noyau Linux de la mise en œuvre d'un atomic lire et à écrire et quelques questions.

D'abord, le code de l'architecture ia64:

typedef struct {
    int counter;
} atomic_t;

#define atomic_read(v)      (*(volatile int *)&(v)->counter)
#define atomic64_read(v)    (*(volatile long *)&(v)->counter)

#define atomic_set(v,i)     (((v)->counter) = (i))
#define atomic64_set(v,i)   (((v)->counter) = (i))
  1. Pour les opérations de lecture et écriture, il semble que l'approche directe a été prise afin de lire ou d'écrire dans la variable. Sauf s'il y a un autre truc quelque part, je ne comprends pas quelles garanties existent que cette opération sera atomique dans le domaine de montage. Je crois qu'une réponse évidente sera qu'une telle opération se traduit par une assemblée opcode, mais tout de même, comment est garanti lors de la prise en compte de la mémoire différents niveaux de cache (ou d'autres optimisations)?
  2. Sur la lecture des macros, le volatile type est utilisé dans un casting truc. Quelqu'un a une idée de comment cela affecte l'atomicité ici? (Notez qu'il n'est pas utilisé dans l'opération d'écriture)

source d'informationauteur EdwardH | 2012-02-15