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 :p

    unsigned 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.


Anmelden zum Antworten