QThread: Zugriff auf Array aus mehreren Threads



  • Hallo,
    ich versuche ein Programm schneller zu machen, indem ich mal mehr als nur 50% Leistung von meinem Dualcore-Prozessor verlange...

    Pseudocode:

    char *readstring;
    readstring = new char[512];
    char writestring;
    writestring = new char[512];
    
    //512 Zeichen in readstring einlesen
    
    thread a(); //die klasse thread ist abgeleitet von qthread
    thread b();
    
    a.start();
    b.start();
    
    //a liest in den ersten 256 feldern und schreibt in den ersten 256 feldern von writestring
    //b liest in den zweiten 256 feldern und schreibt in den zweiten 256 feldern von writestring
    
    a.wait();
    b.wait();
    

    mein Programm bricht nach einer zufälligen bearbeiteten Datenmenge ohne fehlermeldung ab. es werden so etwa 25 - 80 MiB bearbeitet

    weiß jemand warum?
    darf ich nicht aus mehreren threads auf ein array (versch. felder!!!) zugreifen



  • darf ich nicht aus mehreren threads auf ein array (versch. felder!!!) zugreifen

    doch solang es verschiedene Felder sind ist das kein Problem.

    sudo rm -rf schrieb:

    mein Programm bricht nach einer zufälligen bearbeiteten Datenmenge ohne fehlermeldung ab. es werden so etwa 25 - 80 MiB bearbeitet

    Hast du mal n Debugger an den Prozess gehängt? sagt der irgendwas? Breakpoints vor die Enden der Threads setzen, dann siehst du ob du irgendwo n Logikfehler drin hast und die Threads ordentlich verlassen werden oder ob da tatsächlich irgendeine Katastrophe passiert.
    auch zu beachten: statische variablen in Funktionen, globale variablen usw. die von den gemeinsam benutzten Funktionen benutzt werden etc. sind alle nicht threadsafe.
    Vielmehr kann man mit den Infos die du gegeben hast dazu nicht sagen denke ich.



  • mhh, danke für die schnelle antwort!
    was ist mit variablen, die ich an funktionen übergebe?

    void fkt(int blub){...}
    //zugriff von a und b auf fkt(3)
    

    sind die threadsafe?



  • sudo rm -rf schrieb:

    mhh, danke für die schnelle antwort!
    was ist mit variablen, die ich an funktionen übergebe?

    void fkt(int blub){...}
    //zugriff von a und b auf fkt(3)
    

    sind die threadsafe?

    Ja, ist ein Wert der auf dem Stack (oder einem Register) abgelegt wird.



  • ahh, ich lese in einem globalen const unsigned int...
    ist das "verboten"?



  • sudo rm -rf schrieb:

    ahh, ich lese in einem globalen const unsigned int...
    ist das "verboten"?

    da es const ist (und du hoffentlich keine const-cast-und-doch-ändern-Schweinereien) damit machst, kanns da keine Probleme geben. Aber bevor du hier zu jeder zweiten Zeile deines Codes ne einzelne Frage stellst solltest du vielleicht dich ein wenig in das Thema Threadsafety einlesen und danach bei ggf. noch bleibenden Fragen nochmal nachhaken - am Besten natürlich mit aussagekräftigem Code 🙂



  • pumuckl schrieb:

    Aber bevor du hier zu jeder zweiten Zeile deines Codes ne einzelne Frage stellst solltest du vielleicht dich ein wenig in das Thema Threadsafety einlesen und danach bei ggf. noch bleibenden Fragen nochmal nachhaken - am Besten natürlich mit aussagekräftigem Code 🙂

    Sehr gerne, ich weiß nur nicht wo.
    Hab kein Buch dazu und die Doku von QT ist ja eigentlich ganz gut, nur zu threadsafety finde ich da nicht allzuviel...


Log in to reply