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? P>
Si oui, quelles sont toutes les opérations d'atomes en utilisant de telles fonctions? p>
sera-t-il plus avantageux d'utiliser de telles fonctions que les primitives de synchronisation normales telles que Mutex, etc.? P>
OS: Windows, Linux, Solaris & Vxworks P>
5 Réponses :
"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») . P>
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 code> - ils ne sont pas ce qu'il semble à première vue et ne sont utiles que dans le contexte des gestionnaires de signaux. p>
sur Windows, il y a InterlockedExchange A > 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. P>
En général, vous pouvez utiliser l'instruction 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. P> XCHG CODE> sur X86 pour les opérations atomiques (Fonctionner sur les processeurs à double noyau, aussi). P>
La bibliothèque C n'a pas d'autre. p>
sur Linux, GCC fournit certains - recherchez Dans le cas de Windows, recherchez 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é. P>
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 Les types correspondent à chacun des types d'entiers normaux - par exemple, __ sync_fetch_and_add code>,
__ sync_fetch_and_sub code>, et ainsi de suite. P>
InterlockedinCrent code>,
InterlockedDecrement``, Code> 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). P>
C11 H3>
atomic_fetch_add code> et
atomic_fetch_sum code> (et
* _ _ explicite code> 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 code>). Il existe également des fonctions code> de clôture code>, telles que
atomic_thread_fence code> et
atomic_signal_fence code>. P>.
atomic_int8_t code> correspondant à
int8_t code> et
atomic_uint_least64_t code> Corpsponding vers
uint_least64_t code>. Ce sont des noms
Typedef code> définis dans
_atomic_uint_least32_t code> au lieu de
atomic_uint_least32_t code>). P>
synch_fetch_and i> * fonctionne assez bien et de tout ce qui peut accueillir GCC, à l'exception du bras. +1
sur toutes les plateformes prises en charge, vous pouvez utiliser Opérations atomiques de Glib < / a>. Sur les plates-formes qui ont des opérations atomiques intégrées (par exemple, des instructions de montage), GLIB les utilisera. Sur d'autres plates-formes, il restera à l'aide de mauîtres. P>
Je pense que les opérations atomiques peuvent vous donner un coup de pouce de vitesse, même si les mutiles sont mis en œuvre les utiliser. Avec le mutex, vous aurez au moins deux ops atomiques (verrouillage et déverrouillage), plus l'opération réelle. Si l'OP atomique est disponible, c'est une seule opération. P>