Großes strtok-Problem



  • Wenn ich strtok oft und multithreaded aufrufe, dann cracht meine Anwendung oft.
    MSDN Bescreicht dieses Problem so:

    Note Each function uses a static variable for parsing the string into tokens. If multiple or simultaneous calls are made to the same function, a high potential for data corruption and inaccurate results exists. Therefore, do not attempt to call the same function simultaneously for different strings and be aware of calling one of these functions from within a loop where another routine may be called that uses the same function. However, calling this function simultaneously from multiple threads does not have undesirable effects.

    Ich habe daran gedacht mir eine SafeStrtok-Funktion zu schreiben, mit folgender Syntax:

    char* SafeStrtok(char* what,char seperator);
    

    Leider habe ich keine Ahnung wie ich das Angehen soll.
    Kann mir jemand helfen? 😞 *sniff*

    [ Dieser Beitrag wurde am 27.10.2002 um 17:23 Uhr von Mr. Suicide editiert. ]



  • schau mal ob dein System die Funktion strtok_r hat (ist POSIX.1c), die Version ist Thread safe.

    Ansonsten könntest du das so machen, dass du die Eingabe parst und dem User einfach einen Pointer zurückgibst, wie weit du bist etc. von dem du das nächste mal weiterarbeitest (strtok_r macht das so)



  • Nein. 😞



  • Und hat jemand Ideen für SafeStrtok(); 😞 😕

    [ Dieser Beitrag wurde am 27.10.2002 um 22:30 Uhr von Mr. Suicide editiert. ]



  • Hilft dir das weiter: Nochmal zu Threads

    MfG, phreaking



  • selber parsen... strtok ist ja keine groesse zauberei, mit strchr kann man das sehr leicht selber machen...



  • Original erstellt von Mr. Suicide:
    **Ich habe daran gedacht mir eine SafeStrtok-Funktion zu schreiben, mit folgender Syntax:

    char* SafeStrtok(char* what,char seperator);
    

    **

    Das Ding gibt's, in fast genau der Form, schon unter dem Namen 'strchr' in der Standardbibliothek.



  • Hab mit strtok_r aus einer FreeBSD Datei rauskopiert.
    Jetzt funzt's.

    char *__strtok_r(char *s, const char *delim, char **last)
    {
        char *spanp, *tok;
        int c, sc;
    
        if (s == NULL && (s = *last) == NULL)
            return (NULL);
    
        /*
         * Skip (span) leading delimiters (s += strspn(s, delim), sort of).
         */
    cont:
        c = *s++;
        for (spanp = (char *)delim; (sc = *spanp++) != 0;) {
            if (c == sc)
                goto cont;
        }
    
        if (c == 0) {       /* no non-delimiter characters */
            *last = NULL;
            return (NULL);
        }
        tok = s - 1;
    
        /*
         * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
         * Note that delim must have one NUL; we stop if we see that, too.
         */
        for (;;) {
            c = *s++;
            spanp = (char *)delim;
            do {
                if ((sc = *spanp++) == c) {
                    if (c == 0)
                        s = NULL;
                    else
                        s[-1] = '\0';
                    *last = s;
                    return (tok);
                }
            } while (sc != 0);
        }
        /* NOTREACHED */
    }
    
    char *SafeStrtok(char *s, char *delim)
    {
        char *last;
    
        return (__strtok_r(s, delim, &last));
    }
    

    [ Dieser Beitrag wurde am 28.10.2002 um 20:55 Uhr von Mr. Suicide editiert. ]



  • 😃 deine Safe Funktion bringt nichts, da du wieder static benutzt, dann kannst du strtok direkt benutzen, ist genauso Thread Safe 😉

    BTW.
    sind Unterstriche am Anfang des Dateinamens AFAIK dem Compiler vorbehalten.



  • Whoops static habich nicht gelöscht...



  • jetzt hast du aber das Problem, dass last immer wieder neuinitalisiert wird und sich also die Position nicht merkt.



  • Und was soll ich tun... 😞 😕



  • dir bleibt nichts anderes über, als Prozesse anstelle von Threads zu verwenden, strtok_r zu benutzen, mit dem Zusatz Parameter, eine eigene tok Funktion schreiben, die keine weiteren Informationen benötigt (zB. liefert die einfach ein char** zurück, in dem alles getokenized ist).



  • 😞 Trotzdem danke.


Anmelden zum Antworten