Forum: PC-Programmierung Anfängerprobleme mitThreads


von Kurt (Gast)


Lesenswert?

Muss ich bei der Funktion CreatThreade Handle noch irgend etwas 
zusätzliches bechten?

Habe eine Klasse cCol.

und Struktur für ThreadData:

  {

   cCol *pCol;   //Klasse
   int rz;
   int lz;
 }

im Main werden zwei Threads erzeugt:

ThreadData *threadData=new ThreadData; //für die Parameter des Threads
threadData->rz=0;
threadData->lz=1;
HANDLE Thread1=CreateThread(0,0,ThreadFunc,(LPVOID) 
threadData,0,&ThreadID1);
threadData->rz=1;
threadData->lz=2;
HANDLE Thread2=CreateThread(0,0,ThreadFunc,(LPVOID) 
threadData,0,&ThreadID2);

Mein Problem: Beim Debuggen springt er mir zwar in die ThreadFunc aber 
die Variablen rz und lz sind beim 1 und 2 Threads die selben?

d.h:
Thread1:
rz=1;   müsste 0 sein
lz=2;   müsste 1 sein
Thread2:
rz=1;
lz=2;


Habe leider noch nicht soviel Erfahrung mit Threads.

von Peter (Gast)


Lesenswert?

Hallo,
das problem ist da du die gleiche variable/stuktur an beide thread 
übergibtst.

ThreadData1 *threadData=new ThreadData; //für die Parameter des Threads
threadData1->rz=0;
threadData1->lz=1;
HANDLE 
Thread1=CreateThread(0,0,ThreadFunc,(LPVOID)threadData1,0,&ThreadID1);

ThreadData2 *threadData=new ThreadData; //für die Parameter des Threads
threadData2->rz=1;
threadData2->lz=2;
HANDLE 
Thread2=CreateThread(0,0,ThreadFunc,(LPVOID)threadData2,0,&ThreadID2);

sollte gehen.

von Kurt (Gast)


Lesenswert?

Er soll aber auf die gleiche Klasse zugreifen und es sollen nur die 
Parameter rz und lz verändert werden. Ich dachte da jeder Thread seinen 
eigenen Stack hat......

von Peter (Gast)


Lesenswert?

ja jeder thread hat seinen eignen stack, aber dafür muss du ja erstmal 
eine variable auf den stack anlegen, selbst wenn du in der  ThreadFunc 
eine Kopie von threadData machst, kenn es passieren das die beiden 
thread in andere reihenfolge gestartet werden.
Die ThreadFunc wird nicht beim CreateThread aufgerufen, es wird nur der 
thread ereugt, wann er daran ist entscheidet der sheduler. Kann also 
auch passieren das zuerst der 2. und dann der 1. gestartet wird.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ja, sicher hat jeder Thread seinen eigenen Stack. Du aber übergibst 
beiden Threads denselben Pointer auf ein auf dem Heap (und keinem Stack) 
liegendes Objekt.

von Kurt (Gast)


Lesenswert?

OK! Danke für die schnelle Antwort!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.