[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, ¶ms);
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(¶ms)
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.
-
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ärestd::thread
(ab C++11, bzw.boost::thread
für C++03) zu verwenden, und dann einfach einenstd::shared_ptr
(ab TR1 bzw. sonstboost::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 wennrunExportMT
aufgerufen wird während der Thread vom vorigen Aufruf noch läuft?