PDA

Visualizza la versione completa : [C++] Bug di reset inaspettato di variabile con thread


misterx
11-07-2018, 11:39
Ciao,
ho un progetto in C++ il quale alla sua esecuzione legge una lista di numeri

100
25
37
48

e memorizza il suo numero in una variabile globale per il suo utilizzo da parte di alcuni cicli.

Quello che non mi spiego è che senza generare alcun errore tale variabile dopo un certo numero di cicli si azzera e forse mi sfugge qualcosa che non ho ancora assimilato in merito alle eccezioni ed ai thread.


DWORD WINAPI ThreadPro( LPVOID lpParameter )
{
FILE *fp;
char tmpbuf[20];
int n=0;

fp=fopen("lista.txt","r");
while(fgets(tmpbuf,sizeof(tmpbuf),fp) != NULL)
{
tmpbuf[strlen(tmpbuf)-1]='\0';
ArrayLista[n++]=atoi(tmpbuf);
}
fclose(fp);


while(!bAbort) // ciclo all'infinito XY
{
for(int i=0; i < n; i++)
SendMyMessage(ArrayLista[i]);
// qui in maniera pseudocasuale n si azzera nonostante
// il codice esterno al while non viene più letto, ma solo allo start del thread
}
}

void SendMyMessage( char *msg)
{
for(int actconn = 0; actconn < Form1->ServerSocket1->Socket->ActiveConnections; actconn++)
Form1->ServerSocket1->Socket->Connections[actconn]->SendBuf(msg, len);
}


magari mi sfugge qualcosa

Grazie 1000

oregon
11-07-2018, 19:40
Prima di tutto, mi spieghi come mai in

SendMyMessage(ArrayLista[i]);

passi un argomento tramite puntatore a char anche se mi mi sembra un intero ?

misterx
11-07-2018, 21:24
purtroppo è un errore di copia e incolla, grazie per avermelo fatto notare

oregon
12-07-2018, 14:22
purtroppo è un errore di copia e incolla, grazie per avermelo fatto notare

Prego ma non capisco come possa essere un errore di copia incolla ...

misterx
12-07-2018, 15:18
scusa ma quello è solo un pseudo-codice di esempio, mi interessa solo capire come si ragiona con i thread.
Ho scoperto che se int n; lo dichiaro globale anziché locale, il problema sparisce. Aggiungo che non osservo alcun tipo di errore durante il funzionamento del programma, non mi spiego quindi l'azzeramento della variabile n.

oregon
13-07-2018, 07:37
Se lo stack viene sporcato e la variabile modificata non dipende dalla questione thread ma da errori nel codice.
Ma se non mostri il codice effettivo in cui succede il problema, di che discutiamo?

misterx
13-07-2018, 12:04
grazie Oregon, mi hai messo comunque sulla strada giusta dicendomi che i thread non c'entrano nulla.
Era un problema di allocazione di memoria che causava un errore alquanto depistante. Sto usando una DLL dove hanno modificato le dichiarazioni a certe strutture ed a me era sfuggita questa variazione.

Loading