Bonjour,

Je découvre actuellement les joies de la programmation concurrente, et suis tombé sur un bel article faisant usage de std::atomic<T*> pour créer une file thread safe et sans lock.

Dans cet article justement, l'auteur (Herb Sutter) utilise le type std::atomic<T*> comme s'il s'agissait d'un pointeur normal, c'est à dire en substance :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
struct node {
    node* next;
};
std::atomic<node*> some_node = ...;
some_node = some_node->next;
Or, j'ai beau regarder dans mon implémentation (GCC 4.7) et sur les sites décrivant la nouvelle norme C++11 (click), il n'est fait mention nulle part que std::atomic<T*> dispose d'un T* operator -> () (i.e. le code ci-dessus génère une erreur à la ligne 5).

J'ai donc deux questions :
  • Sutter fume-t-il de l'herbe ?
  • Pourquoi cet opérateur n'est-il pas ajouté à la spécialisation de std::atomic<T> pour T = U* ?


Si vous connaissez la réponse à la seconde (la première m'intéresse moins), je suis intéressé.