Comment effectuer des opérations atomiques sur Linux qui fonctionnent sur des systèmes x86, arm, GCC et de la cpi?

Tous les OS Modernes offre aujourd'hui quelques opérations atomiques:

  • Windows a Interlocked* API
  • FreeBSD a <machine/atomic.h>
  • Solaris a <atomic.h>
  • Mac OS X a <libkern/OSAtomic.h>

Quelque chose comme ça pour Linux?

  • J'en ai besoin pour travailler sur la plupart des Linux pris en charge les plates-formes, y compris: x86, x86_64 et bras.
  • J'en ai besoin pour travailler sur au moins GCC et Intel Compilateur.
  • Je n'ai pas besoin d'utiliser la 3ème par la bibliothèque comme glib ou qt.
  • J'en ai besoin pour travailler en C++ (C pas obligatoire).

Questions:

  • GCC atomique les builtins __sync_* ne sont pas pris en charge sur toutes les plateformes (BRAS) et ne sont pas pris en charge par le compilateur Intel.
  • Autant que je sache <asm/atomic.h> ne doit pas être utilisé dans l'espace utilisateur et je n'ai pas réussi du tout. Aussi, je ne sais pas si cela pourrait fonctionner avec les processeurs Intel compilateur.

Des suggestions?

Je sais qu'il y a de nombreuses questions, mais certains d'entre eux du point de __sync* qui n'est pas possible pour moi (BRAS) et un point de asm/atomic.h.

Peut-être il ya une ligne bibliothèque de l'assemblée qui fait cela pour GCC (ICC soutient gcc assemblée)?

Edit:

Il y a une solution très partielle pour les opérations d'ajout seulement (permet de mettre en œuvre atomique en vente libre, mais pas de blocage de libre-structures qui nécessitent des CAS):

Si vous utilisez libstc++ (Intel Compilateur utilise libstdc++) alors vous pouvez utiliser __gnu_cxx::__exchange_and_add que défini dans <ext/atomicity.h> ou <bits/atomicity.h>. Dépend de la version de compilateur.

Cependant, je voudrais encore voir quelque chose qui prend en charge le TAS.

  • armv5, armv6 ou armv7?
  • Les bonnes questions. Autant que je sache ll/sc sont uniquement disponibles sur arm6 et ci-dessus? Donc, il serait sans doute pertinent que pour les arm6 et au-dessus
  • Donc, nous allons préciser qu' - GCC sont intrinsèques pas pris en charge sur les BRAS à cause de la GCC de la chaîne d'insuffisances ou en raison du BRAS de défauts? Pouvez-vous confirmer que vous ne pouvez pas les utiliser avec GCC pour les BRAS qui prend en charge les atomique ops?
  • BRAS de lacunes. Certains connexes de soutien instructions: ARM v5: SWP(atomique swap de la taille de mot et la taille en octets) ARM v6: LDREX/STREX(32 bits enchaîné éventuellement atomique load/store)+SWP ARM v7: LDREX/STREX(de même que le v6, mais avec des options de taille pour les 8/16bits) V5 ne peut pas faire atomique incrément sans désactiver les interruptions, de l'espace utilisateur ne peut pas faire. Cependant, ce qu'il peut faire est d'appeler le système d'exploitation à dire, une interruption logicielle, et ont le handle de la place.
  • Similaire pour le C, mais ne nécessitant pas autant de portabilité: stackoverflow.com/questions/2353371/atomic-increment-fetch
InformationsquelleAutor Artyom | 2010-02-18