Kopie eines structs an Thread übergeben



  • Mit folgender Funktion erstelle ich einen Thread, und übergebe diesem eine Referenz eines structs. Nachdem die Funktion abgearbeitet ist, wird der Speicher leer geräumt, mitsamt des Objektes, welches innerhalb des Threads noch benötigt wird.

    dummyfunction(...) {
    		...
    
    		// set client-members
    		struct clientObj client;
    		client.sock = fd;
    
    		// create thread
    		pthread_t clientThread;
    		if(pthread_create(&clientThread, NULL, runThread, &client)) {
    			printf("thread creation failed.\n\r");
    		}
    
    		...
    }
    

    Gibt es eine Möglichkeit dem Thread eine Kopie des structs zu übergeben, oder diese innerhalb des Threads anzulegen, bevor der Speicher geleert wird?

    mfg Tom



  • struct mit new auf dem heap anlegen



  • Danke, doch auch hier spuckt der Compiler einen Fehler aus, mit welchem ich derzeit kaum etwas anfangen kann. 😞

    void *dummyObj::thread(void *arg) {
    	printf("[thread] started\n\r");
    	dummyObj* dummy = (dummyObj*)arg;
    
    	// Kopie des Objektes
    	struct dummyObj client = new dummyObj(dummy); //<===== ZEILE 299
    
    	...
    }
    
    main.cpp: In static member function `static void* dummyObj::thread(void*)':
    main.cpp:299: error: no matching function for call to `dummyObj::dummyObj(
       dummyObj*&)'
    main.cpp:270: error: candidates are: dummyObj::dummyObj(const dummyObj&)
    main.cpp:283: error:                 dummyObj::dummyObj()
    make: *** [all] Fehler 1
    


  • Die Fehlermeldung sagt aus dass dummyObj keinen constructor hat die eine referenz auf einen pointer auf ein dummyObj als parameter annimmt.
    Ausserden sagt sie aus dass ein construktor vorhanden ist der eine const referenz auf ein dummyObj als parameter annimmt. Nimm am besten diesen.

    struct dummyObj client = new dummyObj(*dummy);
    

    Kurt



  • "new" liefert doch einen Zeiger auf das neu erstellet Objekt zurück, also muss links vom "=" auch ein Zeiger stehen

    struct dummyObj *****client = new dummyObj(dummy);



  • sorry sollte heissen
    [cpp]struct dummyObj client = new dummyObj*(*dummy)**;[/cpp]
    So sollte es wirklich richtig sein.
    K.



  • Danke euch beiden.
    Die Übergabe des Objektes funktioniert nun einwandfrei.
    Doch beim Debuggen bin ich auf ein weiteres Problem gestoßen. Das Objekt scheint ewig im Speicher zu liegen. Ein "free(client)"aufruf erzielt auch nicht den erhofften Erfolg, wahrscheinlich, da es sich bei der Variablen "client" um einen Pointer handelt.

    Wie also kann ich den Speicher des structs am Ende der Funktion wieder aufräumen/freigeben?

    mfg Tom



  • Zu new gehört delete, nicht free.



  • 🙂 Danke.

    Und gleich morgen werde ich mir endlich mal ein Buch mit den nötigen Grundlagen zulegen. damit ich euch nicht andauernd auf den Senkel gehen muss. 🙄

    Tom


Anmelden zum Antworten