CAS (Compare And Swap) unter Linux bzw BSD
-
Hallo Leute.
Unter Windows habe ich fuer CAS die schoene Interlocked* Sammlung an Funktionen, unter Mac OS habe ich die OSAtomic* Reihe und unter Solaris eine handvoll atomic_* Funktionen.
Fuer Linux oder generell irgendwelche halbwegs standardisierten BSD Funktionen habe ich leider nichts finden koennen. dh, gefunden habe ich natuerlich schon ein paar Sachen, aber bei einer Google Suche nach den einzelnen Funktionen kommen sowenige Treffer, dass ich nicht glaube dass das weit verbreitet ist (unter AIX scheint es zB compare_and_swap zu geben, aber das kann doch nicht sein dass jedes System da sein eigenes Sueppchen kocht, oder?).
Jedenfalls wenn es nichts halbwegs standardisiertes gibt, wuerde mich die Varianten in Linux 2.6 und FreeBSD am meisten interessieren.
Hat jemand Links oder sonstige gute Ratschlaege?
Danke schonmal
-
Schreib sie doch selber. Naja dadurch ist das ganze vielleicht Compiler und ISA abhängig aber wenn du nur das OS wechselst bleibt das gleich
Ein CAS für x86 sähe z.B. so aus (GCC-Inline-Assembler).
bool atomicCompareAndExchange(volatile unsigned int *at, int32_t cmpVal, int32_t newVal) { bool bool_; asm volatile(LOCK " cmpxchgl %%ecx, (%%ebx)\n" "je true\n" "xorl %%eax, %%eax\n" "jmp end\n" "true:\n" "mov $1, %%eax\n" "end:\n": "=a" (bool_): "a" (cmpVal), "b" (&*at), "c" (newVal)); return bool_; }
-
Die Linux-Kernel-API bietet einem atomic_*-Zeugs an. Aber ich weiß nicht, ob so etwas auch in der glibc ist.
-
Selber schreiben will ich gerade vermeiden - da ich die Hardware nicht habe um es auf allen moeglichen Systemen zu testen.
@ruediger:
kann ich die Kernel API im Userland ansprechen?
Oder kannst du mir zumindest die passende include Datei nennen?
Waere super
Danke
-
Die glibc scheint dafür auch etwas zu haben: http://google.com/codesearch?hl=en&q=__arch_compare_and_exchange+package:http://ftp.gnu.org/gnu/glibc/glibc-2.3.3.tar.bz2+show:mVzwzSy27Vs:9vn3pT-sUp0:AMraxLQKhwU&sa=N&cd=6&ct=rc&cs_p=http://ftp.gnu.org/gnu/glibc/glibc-2.3.3.tar.bz2&cs_f=glibc-2.3.3/include/atomic.h
-
rüdiger schrieb:
Die glibc scheint dafür auch etwas zu haben: http://google.com/codesearch?hl=en&q=__arch_compare_and_exchange+package:http://ftp.gnu.org/gnu/glibc/glibc-2.3.3.tar.bz2+show:mVzwzSy27Vs:9vn3pT-sUp0:AMraxLQKhwU&sa=N&cd=6&ct=rc&cs_p=http://ftp.gnu.org/gnu/glibc/glibc-2.3.3.tar.bz2&cs_f=glibc-2.3.3/include/atomic.h
super. danke
genau das habe ich gesucht.
-
Die libstdc++ vom gcc scheint da auch entsprechende Funktionalität bereitzustellen, ich weiss nicht genau seit welcher Version:
z.b. compare_and_swapSolange der GCC auf dem System kompilierbar ist sollte es dann auch z.b. CAS geben.