La norme C++ 11 garantit-elle que std::atomic est implémentée en tant qu'opération atomique?

Je suis à une jonction, j'essaie d'en choisir une entre la structure de données basée sur le verrou mutex et la structure de données sans verrou ( et éventuellement sans attente).

En creusant un peu plus loin, je n'ai trouvé aucun mot sur le fait que le standard C++ 11 supporte les opérations atomiques pour les types atomiques, pas même pour les intégrales basées sur la largeur comme atomic_uint32_t . En d'autres termes, ce n'est pas seulement l'interface std::atomic<> qui est Pas accordée pour être vraiment atomique, la seule chose qui semble être accordée pour être atomic dans toute la bibliothèque standard est std::atomic_flag .

Est-ce vrai ou je manque quelque chose ? Quelle est la raison ? Je veux dire que la norme appelle "atomique" quelque chose qui n'est clairement pas atomique du tout et c'est quelque chose qui est même autorisé à utiliser des Mutex ou à bloquer des appels sous le capot.

21
demandé sur user2485710 2013-11-11 10:55:38

2 réponses

La norme C++ ne garantit pas que les opérations std::atomic<T> sont atomiques. Cependant, vous pouvez utiliser std::atomic<T>::is_lock_free() pour savoir si l'opération de std::atomic<T> est sans verrou 29.6.5 [atomics.type.opérations.req] paragraphe 7:

Retourne: True si les opérations de l'objet sont sans verrou, false sinon.

S'il n'est pas sans verrou, il fera toujours la synchronisation requise mais il utilise un verrou pour le faire.

11
répondu Dietmar Kühl 2013-11-11 07:06:40

Si par atomique vous voulez dire, en utilisant le support matériel sans verrous, alors oui, la norme ne vous donne pas de garantie pour cela. Pourquoi? Eh bien, parce que différentes architectures prennent en charge différents types d'atomicité matérielle. {[0] } a la méthode pratique is_lock_free() qui peut être utilisée pour vérifier si l'objet donné est réellement sans verrou, ou utilise un verrou en interne pour garantir les opérations atomiques. Vous pouvez l'utiliser et vérifier votre matériel cible que ce soit sans verrou ou non, puis décider quelles données structure à aller pour.

Cependant, cela étant dit, si l'architecture cible a un support matériel pour les opérations atomiques pour les intégrales à Largeur fixe qui vous intéressent, et que vous n'avez pas obtenu votre copie de la bibliothèque standard de The shady software shop dans le ghetto, il va probablement utiliser le matériel au lieu d'un verrou complet.

9
répondu JustSid 2013-11-11 07:20:48