Probleme mit dem Thread?



  • Hi,
    ich versuche einen Quellcode nachzuvollziehen und stolpere dabei
    über einen Fehler in einem Thread. Zumindest bin ich der Meinung es liegt daran.

    Hier ein Codeausschnitt:

    int numThreads = 50;
    LPDWORD threadId[50];//anzahl der threads, wie numThreads
    //...
    
    for(int i=0;i<numThreads;i++){
    MessageBox("created another thread!");
    hThread=::CreateThread(0,0,SendSocket,NULL,NULL,threadId[i]);
    if(hThread==NULL){
    tStarted=false;
    MessageBox("error creating thread!");
    }
    Sleep(100);
    }
    

    SendSocket sieht dann so aus:

    DWORD WINAPI SendSocket(LPVOID){
    	sockaddr_in tempSockAddr = sockAddr;
    	SOCKET tempSock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
    
    while(tStarted){
    char buf[] = "domain-server-stresstest";
    
    if (sendto(tempSock,buf,strlen(buf),0,(sockaddr *)&tempSockAddr,sizeof(tempSockAddr))==SOCKET_ERROR){
    MessageBox(0,"error sending data!",0,0);
    		}else{
    			tBitCount += sizeof(buf);
    			MessageBox(0,"daten gesendet!",0,0);
    		}
    	}
    	return 0;
    }
    

    Sobald ich für CreateThread bei der ThreadId ein Array definiere und so
    50 Threads erzeugen will, erhalte ich nach dem ersten erzeugten Thread einen
    Programmabsturz. Also direkt nach der MessageBox mit "created another thread".

    Fehler:

    hThread=::CreateThread(0,0,SendSocket,NULL,NULL,threadId[i]);
    

    So läuft es:

    hThread=::CreateThread(0,0,SendSocket,NULL,NULL,threadId);
    

    Der Debugger stoppt in:
    > stresstest.exe!AfxDeactivateActCtx(unsigned long dwFlags=0, unsigned long ulCookie=531890196) Zeile 260 + 0x17 Bytes C++
    in der afxstate.cpp. Leider sagt mir das nicht viel. 😕



  • Du hast Speicher überschrieben....

    Ändere:

    LPDWORD threadId[50];
    

    nach

    DWORD threadId[50];
    

    und

    hThread=::CreateThread(0,0,SendSocket,NULL,NULL,threadId[i]);
    

    nach

    hThread=::CreateThread(0,0,SendSocket,NULL,NULL, &threadId[i]);
    


  • 😃 Funktioniert.



  • Noch eine Frage:

    Im MSDN wird es wie oben beschrieben als Exampel gelistet habe ich gesehen.
    Aber welchen Vorteil birgt dann dieser Variant hier?

    hThread[i]=CreateThread(0,0,SendSocket,NULL,NULL,&threadId);
    

    Ich dachte man muss im 6ten Parameter eine eindeutige ID (durch ein
    Array) mitgeben (also &threadId**[i]**)?



  • Du solltest vielleicht mal die Doku lesen.... Du musst da keine ID mitgeben, sondern bekommst diese zurück...


Anmelden zum Antworten