c ++ - passerer heltal array i tråd funktion

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg arbejder på flere producenter og enkeltkunder problem. Jeg ønskede at passere Thread som 1,2,3 i tråd funktionen, så den enkelte tråd kan navngives baseret på disse tal.


Men programmet kolliderer efter tæller 7, mens du opretter tråd. Jeg tror, ​​problemet skyldes
variabel nThreadNo;
hvis jeg begrænser tællingen mindre end 7, fungerer det fint. men hvis jeg gør tæller mere end dette, går det ned.


void CEvent1Dlg::CreateProducerThreads()
{   

    try
    {
        nThreadNo = new int20]; 
        memset(nThreadNo,0,20);
        if (nThreadNo ==NULL) return;
    }catch(...)
    {
        MessageBox(\_T("Memory allocation Failed"),\_T("Thread"),1);
        return ;
    }
    int i = 0;
    for ( i = 0;i<20;i++)
    {   
        //nThreadNo = i+1;
        nThreadNo[i] = i+1;
        hWndProducer[i] = CreateThread(NULL,0,(LPTHREAD\_START\_ROUTINE)ProducerThrdFunc,(void*)(nThreadNo+i),0,&dwProducerThreadID[i]);      
        if (hWndProducer[i] == NULL) 
        {
           //ErrorHandler(TEXT("CreateThread"));
           ExitProcess(3);
        }
    }   
    //WaitForMultipleObjects(20,hWndProducer,TRUE,INFINITE);            
}

DWORD WINAPI    ProducerThrdFunc ( LPVOID n )
{
    int *nThreadNo = (int*)n;       
    char chThreadNo[33];
    memset(chThreadNo,0,33);

    while(1)
    {
        itoa(*nThreadNo,chThreadNo,10);
        char* pMsg1 = new char[100];
        char* pMsg2 = new char[100];
        memset(pMsg1,0,100);
        memset(pMsg2,0,100);

        strcpy(pMsg1,"Producer ");      
        strcat(pMsg1," Thread No:");        
        strcat(pMsg1,chThreadNo);

        if (stThreadInfoProd.pEventQueue->AddTail(pMsg1)==TRUE)
        {
            strcpy(pMsg2,"Producer ");      
            strcat(pMsg2," Thread No:");        
            strcat(pMsg2,chThreadNo);
            strcat(pMsg2," Added the Msg");
        }
        else
        {
            strcpy(pMsg2,"Producer ");      
            strcat(pMsg2," Thread No:");        
            strcat(pMsg2,chThreadNo);
            strcat(pMsg2,"failed to Add the Msg");      
        }
        PostMessage(stThreadInfoProd.hWndHandle,UWM\_ONUPDATEPRODUCERLIST,(WPARAM)pMsg2,0);
        strcat(pMsg1," Adding Msg:");
        //PostMessage(stThreadInfoProd.hWndHandle,UWM\_ONUPDATEPRODUCERLIST,(WPARAM)pMsg2,0);        
        Sleep(3000);
    }   
    return 0;
}

Bedste reference



  1. Du nulstiller de første 20 byte af nThreadNo, ikke de første 20 * sizeof(int) bytes som du skal gøre.

  2. Der er andre arrayer, du indekserer i denne kode: hWndProducer, dwProducerThreadID. Er der også nok elementer i dem?


Andre referencer 1


CreateThread -opkaldet passerer heltalværdien, men trådfunktionen selv behandler den som en pointer til heltal. I stedet for dette:


int *nThreadNo = (int*)n;   


Det skal nok være:


int nThreadNo = (int)n;   


Rediger : Jeg kiggede tættere på opkaldet, og jeg ser, at det passerer et heltal. Denne værdi er dog stakdata, som muligvis ikke eksisterer på det tidspunkt, hvor tråden forsøger at læse den. Så det skal nok bare passere heltalværdien: (void*)(nThreadNo[i])

Andre referencer 2


Denne linje


if (nThreadNo ==NULL) return;


er værdiløs.


Operatøren new i moderne C ++ returnerer ikke NULL ved fejl, det kaster en std::badalloc undtagelse, men selvom du bruger en tildeler, der returnerer NULL for at angive fejl, er det for sent at opdage det er du allerede passeret NULL-pegeren til memcpy.