c++, c++11, std:: fonctions de membre atomique

j'essaie d'utiliser std:: atomic library.

  1. Quelle est la différence entre spécialisé et non spécialisé atomique les fonctions de membres?
  2. Quelle est la différence (s'il y en a) entre les fonctions suivantes?
  3. l'opérateur= stocke une valeur dans un objet atomique (fonction membre publique) c. s. magasin (C++11) remplace atomiquement la valeur de l'objet atomique par une valeur non atomique argument (fonction de membre public)
  4. opérateur T() charge une valeur à partir d'un objet atomique (fonction membre publique) c. s. charger (C++11) obtient atomiquement la valeur de l'objet atomique (fonction de membre public).
  5. operator+= v. S. fetch_add
  6. l'opérateur= v. S. fetch_sub
  7. opérateur&= v. S. fetch_and
  8. operator/= v. S. fetch_or
  9. opérateur^= v. S. fetch_xor
  10. Quel est l'inconvénient de déclarer une variable comme atomique c. s. un variable non atomique. Par exemple, quel est l'inconvénient de std::atomic<int> x c. s. int x? En d'autres termes, quelle est la charge d'un variable atomique?
  11. lequel a le plus de frais généraux? Une variable atomique, v. S. une normale variable protégé par un mutex?

Voici la référence à mes quesitons. http://en.cppreference.com/w/cpp/atomic/atomic

10
demandé sur Bo Persson 2012-03-04 07:45:55

3 réponses

Pas un expert, mais je vais essayer:

  1. Les spécialisations (pour les types intégrés tels que int) contiennent des opérations supplémentaires telles que fetch_add. Les formulaires Non spécialisés (types définis par l'utilisateur) ne contiennent pas ces renseignements.
  2. operator= renvoie son argument,store n'est pas. De plus, les non-opérateurs vous permettent de spécifier une commande mémoire. Que dit la norme operator= est définie en termes de store.
  3. comme ci-dessus, bien qu'il renvoie la valeur de load.
  4. idem que ci-dessus
  5. idem que ci-dessus
  6. idem que ci-dessus
  7. idem que ci-dessus
  8. idem que ci-dessus
  9. idem que ci-dessus
  10. Ils font des choses différentes. C'est un comportement indéfini d'utiliser int dans la façon dont vous l'utiliser std::atomic_int.
  11. vous pouvez supposer que le overhead est int <= std::atomic <= int and std::mutex<= signifie "moins de frais généraux'. Il est donc probablement préférable de verrouiller avec un mutex (en particulier pour intégré types), mais pire que int.
10
répondu Pubby 2012-11-05 11:32:57

Quelle est la différence entre les fonctions spécialisées et non spécialisées des membres atomiques?

comme on peut le voir dans la synposis de ces classes sur la norme (§29.5), il y a trois ensembles différents de fonctions de membre:

  • le plus générique fournit seulement stocker, charger, d'échange et de comparer les opérations de change;
  • les spécialisations pour les types intégraux fournissent des opérations d'arithmétique atomique et bitwise, en outre les génériques;
  • la spécialisation pour pointeurs fournit des opérations arithmétiques de pointeur en plus des opérations génériques.

Quelle est la différence (s'il y en a) entre les fonctions suivantes?

operator= stocke une valeur dans un objet atomique (fonction membre publique) c. s. store (C++11) remplace atomiquement la valeur de l'objet atomique par un argument non atomique (fonction de membre public)

(...)

void A::store(C desired, memory_order order = memory_order_seq_cst) volatile noexcept;
void A::store(C desired, memory_order order = memory_order_seq_cst) noexcept;

Nécessite: L'ordre argument ne doit pas être memory_order_consume,memory_order_acquire, ni memory_order_acq_rel.

Effets: Atomiquement remplace la valeur pointée par objet ou par le présent avec la valeur souhaitée. La mémoire est affectée selon le la valeur de order.

C A::operator=(C desired) volatile noexcept;
C A::operator=(C desired) noexcept;

Effets:store(desired)

Renvoie:desired

les formes non-opérateurs sont avantageuses car la cohérence séquentielle n'est pas toujours nécessaire, et elle est potentiellement plus chère que les autres commandes mémoire. Avec une analyse minutieuse, on peut trouver quelles sont les garanties minimales nécessaires pour un fonctionnement correct et choisir l'une des commandes mémoire les moins restrictives, donnant plus de marge de manœuvre à l'optimiseur.

Quel est l'inconvénient de déclarer une variable comme atomique c. s. un non-variable atomique. Par exemple, quel est l'inconvénient de std::atomic<int> x v. S.