Atomare (C99) "struktur"
-
Hallo Leute ich habe eine Strucktur, bspw:
typedef struct { int x, int y;} Point;
nun möchte ich lesen und schreiben des Struktur Object atomar machen. In C++
könnte ich jastd::atomic<Point>
atomicPoint nehmen
oder in C11c_Atomic(Point)tomicPoint;
...Aber in C99 ? habe bissel recherciert je nach platform könnte ich ja locks ein baunen,was mir nich so gefällt.. dann bin ich auf inline ASM gestoßen. ungefäahr so:
void atomic_assign(Point *dest, Point src) { #if defined(__x86_64__) || defined(_M_X64) // x86_64 architecture __asm__ __volatile__ ( "lock; cmpxchg16b %0" : "=m" (*dest) : "m" (*dest), "d" (src.b), "a" (src.a) : "memory" ); #elif defined(__aarch64__) // ARM64 architecture __asm__ __volatile__ ( "ldxr x0, [%0]\n" "stxr w1, %1, [%0]\n" : "=m" (*dest) : "r" (&src), "m" (*dest) : "x0", "w1", "memory" ); #else #error "Unsupported architecture" #endif }
nun die frage ist das straight-forward oder gebastelt? wie löse ich das schön .. ja ich würde natürlich die Funktion
c void atomic_assign(Point *dest, Point src)
extern machen und je nach Plattform die entsprechend bauen/linken .Danke schonmal:)
-
@SoIntMan
Hast du dir mal die Concurrency support library angeschaut?
-
@Quiche-Lorraine sagte in Atomare C "struktur":
@SoIntMan
Hast du dir mal die Concurrency support library angeschaut?
https://en.cppreference.com/w/c/thread.htmlAber ist das nich C11 ?? ich bin in C99 unterwegs... (noch)
-
@SoIntMan
Sorry, mein Fehler. Zu schnell gelesen.Ich mag keine selbst gebastelten Atomic und Co. Datenstrukturen, da diese schwer zu testen sind. Ja sie funktionierten am Anfang immer gut, aber unter Volllast gibt es da schon so manche Überraschung. Man muss ja bedenken dass der Algo an jeder Stelle unterbrochen werden kann.
-
@Quiche-Lorraine sagte in Atomare (C99) "struktur":
Man muss ja bedenken dass der Algo an jeder Stelle unterbrochen werden kann.
aber wird genau das nicht mit dem inline asm befehl vermieden..? weil so wie ich gelesen habe wird das ja genau so unter haube bswp. bei std::atomic gelöst?
-
@SoIntMan
Es könnte für x86_64 passen, aber für ARM64 sehe ich da zwei Befehle. Das müsste man mal durchspielen.
-
Von welcher Art Software sprechen wir denn, muss das für verschiedene OS funktionieren?
-
@DocShoe sagte in Atomare (C99) "struktur":
Von welcher Art Software sprechen wir denn, muss das für verschiedene OS funktionieren?
ja, das war die Idee.. also arm und rtos ....