Comment faire atomique d'incrémentation et de chercher dans C?
Je suis à la recherche d'un moyen de atomiquement incrémenter un court, et ensuite de retour à cette valeur. J'ai besoin de faire tout cela à la fois en mode noyau et le mode utilisateur, il est donc en C sous Linux, Intel 32 bits de l'architecture. Malheureusement, en raison des exigences en matière de vitesse, un mutex lock ne va pas être une bonne option.
Est-il un autre moyen pour ce faire? À ce stade, il semble que la seule option disponible est associé un peu de montage. Si c'est le cas, quelqu'un pourrait-il me diriger vers les instructions appropriées?
OriginalL'auteur Bryan | 2010-03-01
Vous devez vous connecter pour publier un commentaire.
GCC prend en charge les opérations atomiques:
gcc atomics
__sync_add_and_fetch
semble que l'OP est après.J'ai trouvé ceux d'avant, mais il y a deux problèmes. La première est que ma compréhension est qu'ils ne fonctionnent pas avec le noyau compilateur... je ne suis pas sûr pourquoi, alors peut-être il y a un travail autour de. Deuxièmement, même dans l'espace utilisateur, l'éditeur de liens me donne l'erreur suivante: undefined reference to `__synchronisation_add_et_fetch_2' Si quelqu'un peut point des solutions à ces problèmes (ou les deux!) Je serais très reconnaissante.
Tout comme une mise à jour, __synchronisation_add_et_fetch fonctionne dans l'espace utilisateur, si vous incluez le-march=pentium drapeau lors de la compilation (stackoverflow.com/questions/130740/...), donc maintenant je suis en train de travailler sur l'obtention de que le travail dans le module du noyau.
Une autre mise à jour, je crois que c'est parce que la fonction attend un int, alors que je suis en utilisant (et limitée à une courte.
OriginalL'auteur dicroce
GCC
__atomic_*
built-insDe GCC 4.8,
__sync
built-ins ont été dépréciée en faveur de la__atomic
built-ins: https://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/_005f_005fatomic-Builtins.htmlIls mettent en œuvre le C++ modèle de mémoire, et
std::atomic
les utilise en interne.La suite de threads POSIX exemple échoue systématiquement avec
++
sur x86-64, et travaille toujours avec_atomic_fetch_add
.principal.c
Compiler et exécuter:
Démontage de l'analyse: Comment puis-je commencer threads dans la plaine du C?
Testé sur Ubuntu, 18.10, GCC 8.2.0, glibc 2.28.
C11
_Atomic
En 5.1, le code ci-dessus fonctionne avec:
Et C11
threads.h
a été ajouté dans la glibc, 2.28, ce qui vous permet de créer des threads dans le plus pur ANSI C sans POSIX, un minimum praticable exemple: Comment puis-je commencer threads dans la plaine du C?OriginalL'auteur Ciro Santilli 新疆改造中心 六四事件 法轮功