[risolto]thread problema con lo stesso codice

di il
2 risposte

[risolto]thread problema con lo stesso codice

Ciao a tutti..

[MODIFICO PERCHE' ERA SCRITTO VERAMENTE MALE]

Sto studiando i thread, ma non riesco a capire una cosa (anche più di una ma..).
Passo subito al codice perchè non riesco a spiegarmi a parole.

allora qui creo i thread che andranno ad eseguire la stessa funzione e gli passo gli stessi parametri:
for(i=0;i<2;i++)
{
	struttura1.tmp=i;
	if(pthread_create(&t_thread[i],NULL,&routine,&struttura1))
	{
            ..codice di errore
	}
}
ok fin qui non dovrebbero esserci problemi.
ho bisogno che i due thread seguano due flussi di calcolo differenti, le due variabili x e y di struttura2 dovrenno così essere calcolate:

flusso del thread 1
struttura2.x++ e struttura2.y--;
flusso del thread 2:
struttura2.x-- e struttura2.y--;

avendo la funzione in comune, e quindi lo stesso codice, per distinguere i due flussi utilizzo la variabile tmp (che sarebbe quella dentro il for nel codice qui sopra) settata a 0 e passata come parametro al primo thread e poi settata a 1 e passata al secondo thread.

in questo modo dovrei avere un flusso con struttura2.tmp=0 e l'altro con struttura2.tmp=1.

codice della routine:
void* routine(void* args)
{
	struct struttura2;
	struct * arg;

	arg=(struct *) args;
	
        struttura2=*arg;

	if(struttura2.tmp==0)
		struttura2.id=100;
	if(struttura2.tmp==1)
		struttura2.id=101;

questo è il codice della funzione che non si comporta come mi sarei aspettato, ma esegue lo stesso codice cioè quello del secondo thread, che va a sovvrascrivere anche il primo.
In finale ho come risultato che, sia struttura2 del primo thread sia quella del secondo hanno l'id=101.

come posso distinguere il flusso dei calcoli usando la stessa funzione e lo stesso codice?

spero che si capisca meglio il mio problema ora
grazie a tutti

2 Risposte

  • Re: [risolto]thread problema con lo stesso codice

    Ciao Genfree,

    la tua logica è corretta ed anche funzionante, solo che dovresti dare al thread il tempo necessario per partire; cioè nel tuo giro della create dovresti aggiungere una sleep di 1 o 2 secondi. Un'altra soluzione per non utilizzare l'identificativo del thread in struttura consiste nel usare la pthread_self (). Ecco che nella funzione chiamata potresti definire:
    
    ...
       static pthread_t tid;
    ...
       if (!tid || tid==pthread_self())
       {    THREAD 1  }
       else
       {    THREAD 2  }
       tid=pthread_self();
       ...
    
  • Re: [risolto]thread problema con lo stesso codice

    Ti ringrazio xamit, mi hai veramente salvato il c__o..

    Ho inizialmente provato le seconda soluzione che mi hai proposto, quella di pthread_create(), ma non funzionava come doveva, penso perché la funzione la lancio ripetutamente duranete l'esecuzione del programma, e funziona come deve solo la prima volta dopodiché tid prende il tid del secondo thread sempre.

    Ho comunque risolto con una usleep(500) tra il lancio di un thread e l'altro, che se non sbaglio dovrebbero essere 500 microsecondi.
Devi accedere o registrarti per scrivere nel forum
2 risposte