[gelöst] Strukturelemente, nach Übergabe als Zeiger, gelöscht



  • Hallo miteinander.

    Ich möchte die Adresse einer Struktur an eine Multithread-Funktion übergeben. Die Funktion hat folgenden Kopf:

    VOID runExportMT(PVOID pVoid)
    {
    	PPARAMS pParams=(PPARAMS) pVoid;
    
    	...
    }
    

    Aufgerufen wird sie so:

    _beginthread(runExportMT, 0, &params);
    

    Innerhalb der Funktion sind dann allerdings alle Elemente der Struktur gelöscht. Übergebe ich das an eine Dummy-Funktion (mit demselben Kopf), die ich nicht als Multithread-Funktion aufrufe:

    dummy(&params)
    

    behalten die Elemente ihren Wert. Am Multithreading kann es eigentlich nicht liegen, da es vorher funktioniert hat. Habe allerdings keinen Schimmer, was jetzt anders ist.

    Kann mir da vielleicht jemand helfen?

    Dankeschön.



  • Scheint daran gelegen zu haben, dass die Struktur innerhalb der Window-Prozedur nicht als static deklariert war. Dadurch, dass die aufgerufene Funktion als Multithread-Funktion läuft, verlieren die Daten unter der Struktur ihre Gültigkeit, da die Verarbeitung in der Window-Prozedur nach dem Funktionsaufruf weiter läuft und beendet wird.


  • Mod

    Das mit static zu lösen ist auch keine Lösung 😉 zumindest keine die ich jemals akzeptieren würde.



  • Also wenigstens eine Critical Section solltest du deiner Anwendung spendieren. Es sei denn, die Inhalte deiner Struktur sind quasi const (werden mit Beginn der Threads nicht mehr verändert). Wobei du dich auch da lieber mit einer Critical Section oder einer Mutex absichern solltest.



  • @_Bongo
    Die einfache Lösung wäre std::thread (ab C++11, bzw. boost::thread für C++03) zu verwenden, und dann einfach einen std::shared_ptr (ab TR1 bzw. sonst boost::shared_ptr ) auf die Struktur als Parameter zu übergeben.

    (Bzw. es müsste theoretisch auch ein std::unique_ptr gehen - müsste ich aber erst nochmal probieren. Und im Prinzip ist es mMn. Wurscht was von beiden man in diesem Fall verwendet.)

    Falls du weder C++11 noch Boost zur Verfügung hast ... naja, in dem Fall kann man sich mit ner Critical-Section und einem Win32 EVENT die Sache selbst stricken. Ist aber alles andere als schön und auch nicht ganz trivial fehlerfrei hinzubekommen.

    Achja, nochmal dazu warum die static Lösung Kacke ist... Kurzfassung: was wenn runExportMT aufgerufen wird während der Thread vom vorigen Aufruf noch läuft?


Log in to reply