Wie man eine Atomare Inkrement-und fetch in C?
Ich bin auf der Suche nach einem Weg, um atomar Schrittweite eine kurze, und dann wieder, dass Wert. Ich brauche, um dies zu tun, sowohl im kernel-Modus und Benutzer-Modus, so ist es in C unter Linux auf Intel-32bit-Architektur. Leider, aufgrund von Anforderungen an Geschwindigkeit, eine mutex-Sperre nicht eine gute option sein.
Gibt es eine andere Möglichkeit, dies zu tun? An dieser Stelle, wie es scheint, die einzige option, die verfügbar ist, um einige inline-Montage. Wenn das der Fall ist, könnte mir jemand zeigen gegenüber den entsprechenden Anweisungen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
GCC unterstützt atomic operations:
gcc atomics
__sync_add_and_fetch
klingt wie das, was der OP nach.GCC
__atomic_*
built-insAls der GCC 4.8,
__sync
built-ins bereits veraltet, zu Gunsten der__atomic
built-ins: https://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/_005f_005fatomic-Builtins.htmlImplementieren Sie die C++ memory Modell, und
std::atomic
verwendet Sie intern.Den folgenden POSIX-threads Beispiel nicht konsequent mit
++
auf x86-64, und arbeitet immer mit_atomic_fetch_add
.main.c
Kompilieren und ausführen:
Demontage-Analyse an: Wie kann ich start threads in plain C?
Getestet in Ubuntu 18.10, GCC 8.2.0, glibc 2.28.
C11
_Atomic
In 5.1, der obige code funktioniert mit:
- Und C11 -
threads.h
wurde Hinzugefügt, in glibc 2.28, das Ihnen erlaubt, threads zu erstellen in reinem ANSI-C ohne POSIX, minimal lauffähigen Beispiel: Wie kann ich start threads in plain C?