8
votes

Fonctions pour effectuer des opérations atomiques

Y a-t-il des fonctions pour effectuer des opérations atomiques (comme incrémentation / décrémentation d'un entier), etc., supportée par une bibliothèque de temps d'exécution C ou toute autre bibliothèques utilitaires?

Si oui, quelles sont toutes les opérations d'atomes en utilisant de telles fonctions?

sera-t-il plus avantageux d'utiliser de telles fonctions que les primitives de synchronisation normales telles que Mutex, etc.?

OS: Windows, Linux, Solaris & Vxworks


0 commentaires

5 Réponses :


1
votes

"bénéfique" est la situation. Toujours, la performance dépend des circonstances. Vous pouvez vous attendre à ce que quelque chose de merveilleux puisse se produire lorsque vous passez un mutex pour quelque chose comme ça, mais vous ne pouvez pas obtenir aucun avantage (si ce n'est pas le plus populaire d'une affaire) ou que vous aggravez des choses (si vous créez accidentellement un «spin-lock») .


0 commentaires

0
votes

Vous ne savez pas ce que vous entendez par la bibliothèque d'exécution C. La langue appropriée ou la bibliothèque standard ne vous fournit aucun moyen de le faire. Vous auriez besoin d'utiliser une bibliothèque / API spécifique au système d'exploitation. En outre, ne soyez pas dupe par sig_atomic_t - ils ne sont pas ce qu'il semble à première vue et ne sont utiles que dans le contexte des gestionnaires de signaux.


0 commentaires

0
votes

sur Windows, il y a InterlockedExchange Et comme. Pour Linux, vous pouvez prendre Macros atomiques de GLIBC - ils sont portables (voir I486 Atomic.h ). Je ne connais pas une solution pour les autres systèmes d'exploitation.

En général, vous pouvez utiliser l'instruction XCHG sur X86 pour les opérations atomiques (Fonctionner sur les processeurs à double noyau, aussi).

Quant à votre deuxième question, non, je ne pense pas que l'utilisation d'opérations atomiques sera plus rapide que d'utiliser des mutiles. Par exemple, la bibliothèque Pthreads implémente déjà des mutiles avec des opérations atomiques, qui est très rapide.


0 commentaires

7
votes

avant C11

La bibliothèque C n'a pas d'autre.

sur Linux, GCC fournit certains - recherchez __ sync_fetch_and_add , __ sync_fetch_and_sub , et ainsi de suite.

Dans le cas de Windows, recherchez InterlockedinCrent , InterlockedDecrement``, InterlockedExchange`, et ainsi de suite. Si vous utilisez GCC sous Windows, je suppose que cela a également les mêmes intégrés que sur Linux (bien que je n'ai pas vérifié cela).

sur Solaris, ça dépendra. Vraisemblablement si vous utilisez GCC, cela aura probablement (encore) les mêmes intégrés qu'il fait sous Linux. Sinon, il y a des bibliothèques flottant, mais rien n'est vraiment normalisé.

C11

C11 a ajouté une série complète d'opérations atomiques (relativement) d'opérations atomiques et de types atomiques. Les opérations incluent des éléments tels que atomic_fetch_add et atomic_fetch_sum (et * _ _ explicite des versions de la même manière qui vous permettent de spécifier le modèle de commande dont vous avez besoin, où les par défaut Utilisez toujours memory_order_seq_cst ). Il existe également des fonctions de clôture , telles que atomic_thread_fence et atomic_signal_fence . .

Les types correspondent à chacun des types d'entiers normaux - par exemple, atomic_int8_t correspondant à int8_t et atomic_uint_least64_t Corpsponding vers uint_least64_t . Ce sont des noms Typedef définis dans . Pour éviter les conflits avec les noms existants, vous pouvez omettre l'en-tête; Le compilateur lui-même utilise des noms dans l'espace de noms de la implémentation (par exemple, _atomic_uint_least32_t au lieu de atomic_uint_least32_t ).


1 commentaires

synch_fetch_and * fonctionne assez bien et de tout ce qui peut accueillir GCC, à l'exception du bras. +1