Concatinate zwei int zu einem long
-
Moin Wissende!
Ich kranke daran, dass ich zwei int werte in einem long konkatenieren ( also hintereinander ) möchte. Die Idee ist, aus getpid() und pthread_self() innerhalb einer funktion eine caller-referenz-ID zu erzeugen. Die Funktion wird von verschiedenen Threads aufgerufen und anhand der ID kann zugeordnet werden welcher Thread welche Daten verändert. In etwa so:
static void do_something() { long callID = 0; int pid = 0, thid = 0; pthread_mutex_lock(&work_mutex); pid = getpid(); thid = pthread_self(); callID = // hummm joooo, und nun ? :rage: ... pthread_mutex_unlock(&work_mutex); return; }
Das ganze läuft auf "Big-endian". Da getpid() zwar pid_t als type zurückliefert aber der Wert nicht über 2^16 -1 geht, sollte dieser Wert also in zwei Byte vom long passen. Ebenso ist pthread_self eigentlich nur ein int und hat auch nur max 2^16 -1 ( Wird wohl sowieso nicht erreicht, denn 65535 threads in einem Prozess...?? ). Da wir ja meisst mindestens 32 Bit Kisten unser eigen nennen ist das int 4 byte groß.
Also "irgendwie" müssten die beiden int Werte in das long passen.. Nur wie??Daaaanke für eure Hilfä!
Alien
-
Also ich würds auf dem ganz einfachen Weg machen.
char buffer[128]; snprintf(buffer, sizeof(buffer), "%d%d" int1, int2); long = strtoul(buffer, NULL, 0);
(Ich schätze jetzt einfach mal, dass das in nen Long passt. Wenn nicht, einfach das hier ignorieren)
-
Meinen untertänigsten Dank! Ach, es gibt soo viele schöne nette Funktionen in der libc...Alien
-
Hmm...
Wie wärs wenn Du die Thread-ID benutzt, die gettid() (bzw. auf älteren Basissystemen syscall(__NR_gettid)) liefert? Die ist sowieso long, identisch mit der Kernelthread-ID und von vornherein eindeutig, d.h. jeder Thread in jedem Prozess hat eine eindeutige tid.
Ansonsten:
Rechnen geht dann doch noch etwas schneller als eine Zahl->String->Zahl Konvertierung :punsigned long mix = (getpid() << 16) | pthread_self();
-
Ja, wenn der Lord spricht!
Ich würde dir ja gern ein Bier ausgeben nachdem ich schon den Hut gezogen habe!
gettid() und syscall() gibts auf der dummen HP-UX nicht, auf der SunOS nur syscall(). Also probier ich mal die schnelle 16shift Version.Also meine Hochachtung und vielen Dank!
Alien
-
Ah ok. Ich ging (zu automatisch) von Linux aus, und der gettid Syscall ist glaube ich tatsächlich eine Linux-Spezialität.